Java 如何使用URLClassLoader加载*.class文件?
我在玩反射,我想我应该制作一些东西来加载一个类并打印类中所有字段的名称。 我制作了一个小型的hello world类来检查一些东西:Java 如何使用URLClassLoader加载*.class文件?,java,reflection,Java,Reflection,我在玩反射,我想我应该制作一些东西来加载一个类并打印类中所有字段的名称。 我制作了一个小型的hello world类来检查一些东西: kent@rat:~/eclipsews/SmallExample/bin$ ls IndependentClass.class kent@rat:~/eclipsews/SmallExample/bin$ java IndependentClass Hello! Goodbye! kent@rat:~/eclipsews/SmallExample/bin$ p
kent@rat:~/eclipsews/SmallExample/bin$ ls
IndependentClass.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文件,可以由类加载器加载)
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)
我的问题是:
必须向URLClassLoader提供包含.class文件的目录或jar文件:
classUrl = new URL("file:///home/kent/eclipsews/SmallExample/bin/");
是的,您可以从以下位置加载任意数量的类:
使用默认委托父类加载器为指定的URL构造新的URLClassLoader。在父类加载器中首次搜索后,将按照为类和资源指定的顺序搜索URL假定任何以“/”结尾的URL都引用目录。否则,假定URL引用一个JAR文件,该文件将根据需要下载和打开。
所以你有两个选择:
(1) 在这种情况下更容易,但是如果您使用网络资源,(2)可能很方便。我也有类似的问题,但我的类文件位于名为“customElements”的包中。在这种情况下,URL需要构造到根包正上方的文件夹,并且在load方法中,应该传递包含包的类的完整名称。例如,在我的情况下;URL类似于:
File customElementsDir = new File("D:/My Space");
//File customElementsDir = new File("D:\\customElements");
URL[] urls = null;
try {
URL url = customElementsDir.toURI().toURL();
urls = new URL[] { url };
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
clazz = childFirstClassLoader
.loadClass("customElements.CustomLoadableClass");
实际装载量如下:
File customElementsDir = new File("D:/My Space");
//File customElementsDir = new File("D:\\customElements");
URL[] urls = null;
try {
URL url = customElementsDir.toURI().toURL();
urls = new URL[] { url };
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
clazz = childFirstClassLoader
.loadClass("customElements.CustomLoadableClass");
其中childFirstClassLoader是我的类加载器。您必须通过提供完全限定的类名来加载类,该类名是类名,其包路径为
Class c = ucl.loadClass("com.mypackage.IndependentClass");
我也有同样的问题,但我发现这是一个解决方案:
System.getProperty("java.class.path")
这将为您提供jar和类路径。从这里您可以管理您的流程。您在禁止警告什么?一个常见的错误是使用当前目录作为URL,但也将当前目录用于普通类。因为默认的父类是系统类加载器,所以类加载器没有机会加载该类。file:///home/kent/eclipsews/SmallExample/bins/IndependentClass.class 应该是:file:///home/kent/eclipsews/SmallExample/bin/IndependentClass.class 汤姆·霍丁:是的,课堂是原始类型的。这就是我想要的,因为我正在继续构建它,并且希望能够加载任何类。所以我不想发出这样的警告。我会记住那个常见的错误,我相信我很快就会做到的。:-)戴维德:是的,是打字错误。我现在改正了。两个答案都是正确的。我给了一个信息最多的答案。我宁愿两者都接受。好。。