使用Reflection" Class.forName"时出错在Eclipse中

时间:2015-07-29 13:02:53

标签: java eclipse reflection

我正在尝试使用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 {
    // ...
}

我完全复制了这条线,但这引起了两个例外。我搜索了其他问题,他们建议使用正确的包名称。但在我的情况下,我正在默认包下编译它。缺少什么?

2 个答案:

答案 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)被声明为抛出ClassNotFoundExceptioncompile-time checking of exceptions in Java要求您处理此异常(通过捕获它或在throws子句中声明它方法),因为它是所谓的checked exception

注意:您可能需要一种比

更精确的错误处理方法
catch (Throwable te) {
  ...
}

通过捕获特定的异常,特别是ClassNotFoundException(但我很懒,我通过创建实例扩充了示例,因此还需要InstantiationExceptionIllegalAccessException被抓住了。

答案 1 :(得分:0)

forName方法会抛出ClassNotFoundException。您需要在代码中处理它,否则代码将无法编译。

这可能是因为:

  • 您没有注意到主方法签名中的throws ClassNotFoundException
  • 他们没有用样本中的try catch块来打扰块周围
  • 示例没有附带一个try catch用于说明一个ideea,后来揭示了块的目的

运行它确实会为Foo类抛出ClassNotFoundException。 这只发生在Reflection_Test类已声明包时,在这种情况下,您将需要完全限定的Foo名称。

否则,如果没有明确的包,一旦你如上所述使其可编辑,它就会起作用。