1

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

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

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

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);
        };
    }
};
4

2 回答 2

5

您的代码有两个问题:

  • Base并且D1是非静态内部类。这意味着他们可以访问其声明类 ( Main) 的字段和方法,因此他们应该持有对 的实例的引用Main。因此,它们的构造函数有一个类型的隐式参数,Main用于传递该引用。因此,它们没有无参数构造函数,您应该改用单参数构造函数:

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

    或者,您可以简单地将它们声明为static,或在外部声明它们Main- 在这种情况下,它们将无法访问成员,Main也不需要引用它。

  • 的构造函数D1应该是public. 否则,您需要调用setAccessible(true)以使其可用于反射。

于 2012-08-23T09:52:20.730 回答
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");
          }
     }

}

希望这会帮助你..谢谢

于 2012-08-23T10:56:52.280 回答