仅给出.class文件的完整路径,如何加载其Class对象?

时间:2019-04-25 18:19:53

标签: java reflection urlclassloader

我正在开发一个需要能够对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类对象加载到程序中并开始对其进行反射?

1 个答案:

答案 0 :(得分:2)

您有2个选择:

  1. 使用字节码库首先读取文件,以便您可以找到实际的类名。

    例如在您的示例中,它可能是MyPackage.MyClass,但您无法从完全限定的文件名中得知。

  2. 实现自己的ClassLoader子类,并调用defineClass(byte[] b, int off, int len)

推荐使用选项2。