我想用反射创建一个内部类的对象。这是我的班级:
//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
}
答案 0 :(得分:0)
您尝试创建CompTypeConfig
类型的对象,该对象没有没有参数的构造函数。 CompTypeConfig
有两个带有com.google.protobuf.GeneratedMessage.Builder<?> builder
和boolean 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)是不够的。