Java Class.newInstance错误

wor*_*ise 1 java interface class instantiation derived-class

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

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

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

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);
        };
    }
};
Run Code Online (Sandbox Code Playgroud)

axt*_*avt 5

您的代码有两个问题:

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

    Object oo = cc.getConstructor(Main.class).newInstance(new Main()); 
    
    Run Code Online (Sandbox Code Playgroud)

    或者,您可以简单地将它们声明为static,或者在它们之外声明它们Main- 在这种情况下,它们将无法访问其成员,Main并且不需要对其进行引用.

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