2016-05-23 16 views
1

を使用してprivateメソッドをテストしていて、Reflectionを使用して呼び出しています。私が得ているエラーはjava.lang.InstantiationExceptionです。私はそれがClassのインスタンスを作成していないことを知っていますが、私は何が間違っているのか分かりません。 Object object = clazz.newInstance();は、Exceptionをスローする行です。私が持っていないテストJavaリフレクションを使用したオブジェクトのインスタンス化

private int _getType(String type) { 
    if ("DATE".equalsIgnoreCase(type)) return Types.DATE; 
    if ("STRING".equalsIgnoreCase(type)) return Types.VARCHAR; 
    if ("INT".equalsIgnoreCase(type)) return Types.INTEGER; 
    if ("TIMESTAMP".equalsIgnoreCase(type)) return Types.TIMESTAMP; 

    return Types.NULL; 

} 

JUnitテスト

@Test 
public void testGetType() throws Exception { 
    String type1 = "DATE"; 
    String type2 = "STRING"; 
    String type3 = "INT"; 
    String type4 = "TIMESTAMP"; 

    Class clazz = SpringStoredProcImpl.class; 
    Object object = clazz.newInstance(); 

    Method method = object.getClass().getDeclaredMethod("getType", String.class); 
    method.setAccessible(true); 

    method.invoke(object, type1); 

方法は、私はそれを無視してくださいまだ主張します。

ありがとうございます。

+2

メソッド '_getType'を宣言し、' getType'を呼び出そうとします。どうしたの? – user2357112

+0

申し訳ありませんが、それは単にタイプミスでした。それでも同じ問題があります。 –

+0

完全なスタックトレースを追加する – Jens

答えて

0

あなたのケースに存在するno argument constructorのインスタンスを作成しようとしました。

コンストラクタは、あなたが最初のFYI Method method...

から始まるあなたのコードの残りの部分を実行し、newキーワードを使用して、通常は、あなたのオブジェクトを作成する必要がありpublicあるとして、あなたが反射して、オブジェクトを作成したい場合、それはものになるだろう単にclazz.newInstance()のようにclazz.getConstructor(DataSource.class, String.class, ArrayList.class).newInstance(dataSource, sprocName, params)のように

+0

そんなにニコラスにありがとう。今日は素晴らしい学習です。 –

0

異なる回答:しないでください。

なぜこのメソッドをプライベートにする必要があると思いますか?このメソッドの役割は、文字列の入力に基づいて列挙型を「ルックアップ」することです。私は、単にこのメソッドパッケージを保護し、リフレクションオーバーヘッド/混乱を避けることは、もっと意味があると思います。

+0

あなたは正しいですが、私はメソッドのアクセス修飾子を変更することはできませんし、あなたが知っているモデルで何かを行うことはできません。しかし、ええ、それはパッケージにアクセスしてクラスを拡張して簡単にテストできるようにするのがはるかに意味があります。 –

関連する問題