2016-09-05 11 views
0

リフレクションを使って内部クラスのオブジェクトを作成したいと思います。私はリフレクションを使用して内部クラスCompTypeConfigを呼び出す必要がありリフレクションを使って内部クラスのコンストラクタを呼び出す方法

//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; 
    } 
} 

:これは私のクラスです。 私は次の例外を取得しています:

java.lang.IllegalArgumentExceptionが:引数

の間違った数が、私は間違って何をやっているの?
私は、次のコードを使用しています:あなたは、パラメータなしなしコンストラクタを持っていCompTypeConfig型のオブジェクトを作成しよう

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

これは内部クラスではなく、静的ネストされたクラスです。それを構築したい場合は、コンストラクタにパラメータを渡す必要があります。 – shmosel

答えて

0

を。 CompTypeConfigには、com.google.protobuf.GeneratedMessage.Builder<?> builderおよびboolean noInitパラメータの2つのコンストラクタがあります。オブジェクトを作成するときには、それらのためにいくつかのパラメータを渡す必要があります。私が理解したように、あなたはコンストラクタのために間違ったパラメータ型を渡します。

0

あなたは明らかにEMSToCompMessagesクラスではなく、内部クラスのインスタンスを作成しようとします

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

constructor.newInstance(OBJ)を呼び出すようにしようとしています。とにかく

、Javadocは

getConstructor方法について)言うこのオブジェクトが表すクラスの指定されたpublic コンストラクタをリフレクトするConstructorオブジェクトを返します。 parameterTypesパラメータは、 コンストラクタの仮パラメータ型を宣言された順序で識別するClassオブジェクトの配列です。 this Classオブジェクトが非static コンテキストで宣言された内部クラスを表す場合、仮パラメータタイプには、最初のパラメータとして インスタンスを明示的に囲むことが含まれます。

まず、内部クラスのコンストラクタをpublicにする必要があります。この場合、setAccessible(true)を呼び出すだけでは不十分です。