簡體   English   中英

如何使用反射調用內部類的構造函數

[英]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<?> builderboolean 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM