如何使用URLClassLoader加载* .class文件?
我在玩反射,我想做点东西来加载一个类并打印该类中所有字段的名称。我制作了一个小型的hello world类型的类来检查一些东西:
kent@rat:~/eclipsews/SmallExample/bin$ lsIndependentClass.class
kent@rat:~/eclipsews/SmallExample/bin$ java IndependentClass
Hello! Goodbye!
kent@rat:~/eclipsews/SmallExample/bin$ pwd
/home/kent/eclipsews/SmallExample/bin
kent@rat:~/eclipsews/SmallExample/bin$
基于以上所述,我得出两个结论:
- 它存在于/home/kent/eclipsews/SmallExample/bin/IndependentClass.class
- 有用!(因此它必须是可以由类加载器加载的正确的.class文件)
然后使用反射的代码:(标记导致异常的行)
import java.lang.reflect.Field;import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
public class InspectClass {
@SuppressWarnings("unchecked")
public static void main(String[] args) throws ClassNotFoundException, MalformedURLException {
URL classUrl;
classUrl = new URL("file:///home/kent/eclipsews/SmallExample/bin/IndependentClass.class");
URL[] classUrls = { classUrl };
URLClassLoader ucl = new URLClassLoader(classUrls);
Class c = ucl.loadClass("IndependentClass"); // LINE 14
for(Field f: c.getDeclaredFields()) {
System.out.println("Field name" + f.getName());
}
}
}
但是当我运行它时,我得到:
Exception in thread "main" java.lang.ClassNotFoundException: IndependentClass at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at InspectClass.main(InspectClass.java:14)
我的问题:
- 上面我在做什么错?我如何解决它?
- 有没有办法加载几个类文件并对其进行迭代?
回答:
从Javadocs中获取URLClassLoader(URL[])
构造函数:
使用默认的委托父类ClassLoader为指定的URL构造一个新的URLClassLoader。在首次在父类加载器中搜索后,将按照为类和资源指定的顺序搜索URL。
因此,您有两种选择:
- 请参考.class文件所在的目录
- 将.class文件放入JAR并参考
(1)在这种情况下比较容易,但是(2)在使用网络资源时会很方便。
以上是 如何使用URLClassLoader加载* .class文件? 的全部内容, 来源链接: utcz.com/qa/422781.html