我正在尝试使用Eclipse IDE中的书籍样本编译反射示例:
public class Reflection_Test {
public static void main(String[] args) {
// In both cases below, "ClassNotFoundException" occurs
Class c1 = Class.forName("java.util.Date");
Class c2 = Class.forName("Foo");
}
}
class Foo {
// ...
}
我完全复制了这条线,但这引起了两个例外。我搜索了其他问题,他们建议使用正确的包名称。但在我的情况下,我正在默认包下编译它。缺少什么?
答案 0 :(得分:1)
使用
public class Reflection_Test {
public static void main(String[] args) {
try {
Class c1 = Class.forName("java.util.Date");
Class c2 = Class.forName("Foo");
java.util.Date date = (java.util.Date)c1.newInstance();
Foo foo = (Foo)c2.newInstance();
foo.bar(date);
} catch (Throwable te) {
System.out.println(te);
}
}
}
class Foo {
public void bar(java.util.Date date) {
System.out.println("Hello, world! The date is " + date);
}
}
修复了编译错误和
$ javac Reflection_Test.java
$ java Reflection_Test
给出输出
Hello, world! The date is Wed Jul 29 15:39:32 CEST 2015
正如所料。
发生了原始编译问题,因为Class.forName(String className)
被声明为抛出ClassNotFoundException
而compile-time checking of exceptions in Java要求您处理此异常(通过捕获它或在throws子句中声明它方法),因为它是所谓的checked exception。
注意:您可能需要一种比
更精确的错误处理方法catch (Throwable te) {
...
}
通过捕获特定的异常,特别是ClassNotFoundException
(但我很懒,我通过创建实例扩充了示例,因此还需要InstantiationException
和IllegalAccessException
被抓住了。
答案 1 :(得分:0)
forName
方法会抛出ClassNotFoundException
。您需要在代码中处理它,否则代码将无法编译。
这可能是因为:
throws ClassNotFoundException
运行它确实会为Foo类抛出ClassNotFoundException
。
这只发生在Reflection_Test
类已声明包时,在这种情况下,您将需要完全限定的Foo名称。
否则,如果没有明确的包,一旦你如上所述使其可编辑,它就会起作用。