如何使用反射调用内部类的构造函数

时间:2016-09-05 04:37:17

标签: java reflection

我想用反射创建一个内部类的对象。这是我的班级:

//outer class
public final class EMSToCompMessages {
private EMSToCompMessages() {}
//inner class
public static final class CompTypeConfig extends
{
    private CompTypeConfig(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
        super(builder);
        this.unknownFields = builder.getUnknownFields();
    }
    private CompTypeConfig(boolean noInit) { 
        this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); 
    }

    private static final CompTypeConfig defaultInstance;
    public static CompTypeConfig getDefaultInstance() {
        return defaultInstance;
    }
}

我必须使用反射来调用内部类CompTypeConfig。 我得到以下例外:

  

java.lang.IllegalArgumentException:参数数量错误

我做错了什么? 我使用以下代码:

Class<?> loadedMyClass = Class.forName("EMSToCompMessages", true, loader);
        Constructor constructor = loadedMyClass.getDeclaredConstructor();
        constructor.setAccessible(true);
        Object obj = constructor.newInstance();
        Class[] innerClass = loadedMyClass.getDeclaredClasses();
        for (Class<?> getClass : innerClass) {
             Constructor ctor = getClass.getDeclaredConstructors()[0];
                System.out.println(ctor.getName());
                ctor.setAccessible(true);
                Object innerObj = ctor.newInstance(obj);// Exception is coming here
        }             

2 个答案:

答案 0 :(得分:0)

您尝试创建CompTypeConfig类型的对象,该对象没有没有参数的构造函数。 CompTypeConfig有两个带有com.google.protobuf.GeneratedMessage.Builder<?> builderboolean noInit参数的构造函数。在创建对象时,您必须为它们传递一些参数。另外据我所知,你为构造函数传递了不正确的参数类型。

答案 1 :(得分:0)

你显然是想打电话

Object innerObj = constructor.newInstance(obj); //you wrote constru, which isn't defined

constructor.newInstance(obj)将尝试创建EMSToCompMessages类的实例,而不是内部类。

无论如何,Javadoc说(关于 getConstructor 方法)

  

返回反映指定public的Constructor对象   此Class对象表示的类的构造函数。该   parameterTypes参数是一个标识的Class对象数组   构造函数的形式参数类型,按声明的顺序。如果这   Class对象表示在非静态中声明的内部类   上下文,形式参数类型包括显式封闭   instance作为第一个参数。

因此,您首先必须公开您的内部类构造函数。在这种情况下,调用setAccessible(true)是不够的。