java - 从类名获取Java源代码

标签 java class reflection reverse-engineering

有没有办法从类名获取Java源代码?

例如,如果我可以访问类 java.io.File 的库,我需要它的源代码。

我正在研究一种解析器,我需要执行时的源代码。我还必须递归地搜索它。

假设前面提到的类有这个方法:

int method (User user) {...}

我需要获取 User 的源代码,等等等等。

最佳答案

有什么方法可以从类名中获取 java 源代码吗?例如:...

您可能需要几种可能的解决方案之一。在不知道您真正想用这些信息做什么的情况下,我们的建议无法非常精确,但如果可能的话,我会首先引导您远离源代码。 JSE source code与许多开源库一样,可以在线获取,但情况并非总是如此。此外,当您想要查找它时,您需要将其全部组织起来,就像类路径一样,而类对象更容易获取和操作,而无需再次解析文本。

反射(reflection)

如果您只需要在运行时了解某个类的信息,只需使用 the Java Reflection API .有了它,给定一个 Class object例如,您可以获取特定字段的类型、列出所有字段并遍历它们等...:

Class clazz = User.class;
Field field = clazz.getDeclaredField("var");
System.out.println(field.getType().getName());

反射对于发现有关程序中的类的信息很有用,当然您可以遍历整个树而无需查找源代码或解析任何内容。

请记住,您可以使用 Class.forName("MyClass") 查找类对象(只要它在运行时位于类路径中)并反射(reflect)生成的类。

字节码操作

如果您需要的不仅仅是信息,而且实际上想要操作类,那么您需要字节码操作。有些人尝试生成源代码、编译为字节码并加载到他们的程序中,但请相信我——使用可靠的字节码操作 API 要容易得多。我推荐ASM .

有了它,您不仅可以获取有关某个类的信息,还可以添加新字段、新方法、创建新类……如果您感到自虐,甚至可以加载一个类的多个变体。使用 ASM 的示例可以是 found here .

反编译

如果您真的非常需要源代码,但没有可用的源代码,您可以使用各种反编译器之一从类对象中反编译它。他们使用与上述两者相同的信息和技术,但更进一步 [尝试] 生成源代码。请注意,它并不总是有效。我推荐 Jode,但是一个不错的列表,与其他人的比较是 available online .

文件查找

如果您有源代码并且真的只是想查找它,也许您所需要的只是将 .java 文件放在一棵大树中的某个位置,并根据需要根据包名称进行检索。

Class clazz = User.class;
String path = clazz.getPackage().getName().replaceAll("\\.","/");
File sourceFile = new File(path, clazz.getName() + ".java")

你需要更多的逻辑来检查类类型,因为很明显 primatives没有类定义,并且您想以不同方式处理数组类型。

您可以使用 Class.forName("MyClass") 按名称查找类(如果 .class 文件在您的类路径中)。

关于java - 从类名获取Java源代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3190301/

相关文章:

python:具有多态性的类属性/变量继承?

objective-c - 我需要一个很好的类比来理解类方法与实例方法

c# - 多重继承?

c# - 如何在 C# 中使用反射检查集合类型属性的相等性

java解析 float 而不用指数创建 float

java - 通过我的应用程序 JSP 中嵌入的 URL 访问 Jasper Server 上的报告

java - 如何生成唯一的随机数,即使应用程序在一天内关闭

java - java获取字符串中每个字符的相对频率

c# - 将字符串转换为颜色

vb.net - 将 XML 文件加载到 VB.Net 结构中