[英]How to invoke constructor of inner class using 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
}
您嘗試創建一個CompTypeConfig
類型的對象,該對象沒有沒有參數的構造函數。 CompTypeConfig
具有兩個構造函數,其中包含com.google.protobuf.GeneratedMessage.Builder<?> builder
和boolean noInit
參數。 創建對象時,您必須為它們傳遞一些參數。 另外,據我了解,您為構造函數傳遞了錯誤的參數類型。
您顯然正在嘗試致電
Object innerObj = constructor.newInstance(obj); //you wrote constru, which isn't defined
constructor.newInstance(obj)將嘗試創建EMSToCompMessages類的實例,而不是內部類。
無論如何,Javadoc說(關於getConstructor方法)
返回一個構造函數對象,該對象反映此Class對象表示的類的指定公共構造函數。 parameterTypes參數是Class對象的數組,這些Class對象按聲明的順序標識構造函數的形式參數類型。 如果此Class對象表示在非靜態上下文中聲明的內部類,則形式參數類型包括顯式的封閉實例作為第一個參數。
因此,您首先必須將您的內部類構造函數公開。 在這種情況下,僅調用setAccessible(true)是不夠的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.