2009-06-02 17 views
4

私はこのようになりますクラスがあります。次のようにJavaジェネリックと反射!

public class UploadBean { 


    protected UploadBean(Map<String,?> map){ 
     //do nothing. 
    } 
} 

は、リフレクションを使用し、対応するコンストラクタを呼び出すことによって、オブジェクトを作成するには、私はコードを書いた:このコードは、と、実行時に失敗し

Class<?> parTypes[] = new Class<?>[1]; 
parTypes[0] = Map.class; 
Constructor ct = format.getMappingBean().getConstructor(parTypes); 
Object[] argList = new Object[1]; 
argList[0] = map; 
Object retObj = ct.newInstance(argList); 

"そのようなメソッドの例外はありません"。 これで、どのように正しくパラメータタイプを設定できますか?コンストラクタ内のジェネリックマップ引数が特定されるようにします。

+0

「フォーマット」は何ですか? –

+0

形式は、この実装である: パブリックインターフェースFormatFactory { \tパブリックマップ<文字列、クラス>構文getFormat(); \t public class <? UploadBean> getMappingBean();を拡張します。 } – Jay

答えて

7

コンストラクタは保護されています - あなたの代わりにgetConstructorの公共のまたは使用getDeclaredConstructorを作ればそれが動作するはずです。

(あなたは、通常のアクセス権を持っていないどこかからこれを呼び出すしようとしている場合は、setAccessibleを使用する必要があります。)

編集:ここでは大丈夫作業、それを表示するためのテストです:

import java.lang.reflect.*; 
import java.util.*; 

public class UploadBean { 

    // "throws Exception" just for simplicity. Not nice normally! 
    public static void main(String[] args) throws Exception { 
     Class<?> parTypes[] = new Class<?>[1]; 
     parTypes[0] = Map.class; 
     Constructor ct = UploadBean.class.getDeclaredConstructor(parTypes); 
     Object[] argList = new Object[1]; 
     argList[0] = null; 
     Object retObj = ct.newInstance(argList); 
    } 

    protected UploadBean(Map<String,?> map){ 
     //do nothing. 
    } 
} 
+0

getDeclaredConstructor()を使用してください。 –

+0

は動作しません はこの例外を再びスローします: java.lang.NoSuchMethodException:test.fileupload.XYZUploadBean。 (java.util.Map) – Jay

+0

getDeclaredConstructor()はsetAccessible(true)を必要としますか?私のテストではそうではありませんが、main()とUploadBeanを分けることはしませんでした。 –

0

私はあなたがsetAccessibleメソッドを使用すると、アクセスメソッドをオーバーライドすることができます

ct.setAccessible(true) 

を呼び出す必要があります信じています。

1

一般的な情報は実行時には利用できません。静的な解析のためのものです。ジェネリックが存在しないかのように行います。

+1

ええ、エラーは実際にジェネリックスとは関係ありません。これは本当に反映の質問です。 (しかし、この点を明確にすることは良いことです) –

+0

@mmyersが合意しました。 – Jay