Fed*_*ico 3 java reflection reverse-engineering class
有没有办法从类名中获取Java源代码?
例如,如果我可以访问带有类的库java.io.File,我想要它的源代码.
我正在研究一种解析器,我需要在执行时使用源代码.我还要递归搜索它.
说上面提到的类有这个方法:
int method (User user) {...}
Run Code Online (Sandbox Code Playgroud)
我需要获取其User源代码,依此类推及其内部类.
有没有办法从类名中获取java源代码?例如:...
您可能需要几种可能的解决方案之一.如果不知道你真正想要对这些信息做些什么,我们就不能非常精确地推荐我们的建议,但是如果可能的话,我首先会引导你远离源代码.JSE源代码可以在线获得,许多开源库也是如此,但情况可能并非总是如此.另外,当你想要找到它时,你需要保持整齐有序,就像类路径一样,而Class对象更容易掌握和操作,而不必再次解析文本.
如果您只需要在运行时获取有关类的信息,只需使用Java Reflection API即可.有了它,给定一个Class对象,你可以,例如,获取特定字段的类型,列出所有字段并迭代它们等...:
Class clazz = User.class;
Field field = clazz.getDeclaredField("var");
System.out.println(field.getType().getName());
Run Code Online (Sandbox Code Playgroud)
反射对于发现有关程序中的类的信息很有用,当然,您可以遍历整个树而无需查找源代码或解析任何内容.
请记住,您可以使用Class.forName("MyClass")并反映生成的类来查找类对象(只要它在运行时的类路径上).
如果您需要的不仅仅是信息,而且实际上想要操作类,那么您需要字节码操作.有些人试图生成源代码,编译成字节码并加载到他们的程序中,但相信我 - 使用可靠的字节码操作API要容易得多.我推荐ASM.
有了它,您不仅可以获取有关类的信息,还可以添加新字段,新方法,创建新类...如果您感觉自我侮辱,甚至可以加载类的多个变体.可以在此处找到使用ASM的示例.
如果你确实需要源代码,并且没有它可用,你可以使用各种反编译器之一从类对象反编译它.他们使用与上述两者相同的信息和技术,但进一步[尝试]生成源代码.请注意,它并不总是有效.我推荐Jode,但是一个不错的列表,并且可以在线获得其他的比较.
如果你有源代码并且真的只是想查找它,你可能只需要将.java文件放在一个大树中的某个地方,并根据需要根据包名进行检索.
Class clazz = User.class;
String path = clazz.getPackage().getName().replaceAll("\\.","/");
File sourceFile = new File(path, clazz.getName() + ".java")
Run Code Online (Sandbox Code Playgroud)
你需要更多的逻辑来检查类的类型,因为显然灵长类动物没有类定义,并且你想要以不同的方式处理数组类型.
您可以按名称查找类(如果.class文件位于类路径中)Class.forName("MyClass").