Java Class.newInstance错误

时间:2012-08-23 09:43:19

标签: java class interface instantiation derived-class

在下面的代码中,我得到了java.lang.InstantiationException

(下面是编译独立编译的代码 - 在我的应用程序中,我想维护一个Enum->类映射,并在从文件中读取整数值时,实例化查看地图的相应类。)

如何摆脱错误?有语法问题吗?我必须使用接口吗?我在这里的理解是有限的。

class Main {
    abstract class Base {
        Base() {};
        void print() {
            System.out.println("I am in Base");
        }
    }


    class D1 extends Base {
        D1() {};
        @Override 
        void print() {
            System.out.println("I am in D1");
        }
    }

    static Class<? extends Base> getMyClass() {
        return D1.class;
    }


    public static void main(String[] args) {
        try {
            Class<?> cc = getMyClass();
            Object oo = cc.newInstance();
            Base bb = (Base) oo; 
            bb.print();

        } catch (Exception ee) {
            System.out.println(ee);
        };
    }
};

2 个答案:

答案 0 :(得分:5)

您的代码有两个问题:

  • BaseD1是非静态内部类。这意味着他们可以访问声明类(Main)的字段和方法,因此它们应该保存对Main实例的引用。因此,它们的构造函数具有类型Main的隐式参数,用于传递该引用。因此,它们没有no-args构造函数,您应该使用单参数构造函数:

    Object oo = cc.getConstructor(Main.class).newInstance(new Main()); 
    

    或者,您只需将其声明为static,或在Main之外声明它们 - 在这种情况下,他们将无法访问Main的成员,也不会需要参考它。

  • D1的构造函数应为public。否则,您需要致电setAccessible(true)以使其可供反思。

答案 1 :(得分:0)

由于类BaseD1都是具有相同时间的内部类,因此它们是非静态内部类,因此可以通过在Main类中创建对象内部类来访问它们的方法,并且可以调用它们Main构造函数中的方法看起来像这样..

class Main {   
      Main(){     
      D1 dd = new D1();  
      }  
      abstract class Base {  
          Base() {};  
          void print() {  
                System.out.println("I am in Base");  
          }  
      }
     class D1 extends Base {
          D1() {};
          @Override 
          void print() {
              System.out.println("I am in D1");
          }
     }

}

希望这会对你有所帮助..谢谢