我正在开发一个需要能够对Java代码进行一些分析的应用程序;有些通过文字,有些通过反思。用户应该能够输入目录,程序将从其中拉出所有.java和.class文件。我对.java文件没有问题,但是当我尝试获取.class文件的类时,它不起作用。
我看过将ClassLoader与URL一起使用。到目前为止我能找到的东西给了我
URL url = this.openFile().toURI().toURL();
URL[] urls = new URL[]{url};
ClassLoader cl = new URLClassLoader(urls);
Class cls = cl.loadClass(this.path);
return cls;
path
只是一个字符串,其中包含所涉及的.class文件的实际路径,例如Users/me/Documents/Application/out/production/MyPackage/MyClass.class
。从我自己的阅读中了解到,这种方法将我与了解输入的包结构联系在一起,但总的来说我不是。我所拥有的只是.class文件的绝对路径。有没有一种方法,仅使用此路径(或对其进行一些简单的转换)就可以将实际的MyClass类对象加载到程序中并开始对其进行反射?
答案 0 :(得分:2)
您有2个选择:
使用字节码库首先读取文件,以便您可以找到实际的类名。
例如在您的示例中,它可能是MyPackage.MyClass
,但您无法从完全限定的文件名中得知。
实现自己的ClassLoader
子类,并调用defineClass(byte[] b, int off, int len)
。
推荐使用选项2。