【发布时间】:2009-04-10 18:10:32
【问题描述】:
我正在玩反射,我想我会做一些东西来加载一个类并打印类中所有字段的名称。 我制作了一个小型的 hello world 类来检查一些东西:
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 文件)
然后是使用反射的代码:(标记导致异常的行)
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)
我的问题:
- 我在上面做错了什么?我该如何解决?
- 有没有办法加载多个类文件并对其进行迭代?
【问题讨论】:
-
你在禁止什么警告?
-
一个常见的错误是使用当前目录作为 URL,但也将当前目录用于普通类。因为默认父级是系统类加载器,所以您的类加载器没有机会加载该类。
-
file:///home/kent/eclipsews/SmallExample/bins/IndependentClass.class 应该是:file:///home/kent/eclipsews/SmallExample/bin/IndependentClass.class ?
-
Tom hawtin:是的,Class 是一个原始类型。这是我想要的,因为我将继续在它的基础上构建并希望能够加载任何类。所以我压制了那个警告。我会记住这个常见的错误,我相信我很快就会做到。 :-) 大卫:是的,这是一个错字。我现在更正了。
-
两个答案都是正确的。我对信息最多的那个给出了我接受的答案。我宁愿两个都接受。嗯..
标签: java reflection