2017-01-17 1 views
0

私のクラスのメソッドをテストするためのJavaテンプレートを作成しています。 試験対象のクラスはプライベートコンストラクタおよび静的メソッドがあります:テストのための私のテンプレートクラスでJavaのリフレクション - プライベートコンストラクターを持つジェネリッククラスの静的メソッドを呼び出す

public class ProdClass { 
    private ProdClass() { 
    } 

    public static EnumType myMethod() { 
    // do something 
    } 
} 

私はJavaのリフレクションを使用してこのコードを書く:

String className = "com.myproject.mypackage.ProdClass"; 
String testMethodName = "myMethod"; 
Object[] obj = {}; 

... OTHER CODE FOR RENDERING ... 

Class<?> params[] = new Class[obj.length]; 
for (int i = 0; i < obj.length; i++) { 
    if (obj[i] instanceof Integer) { 
     params[i] = Integer.TYPE; 
    } else if (obj[i] instanceof String) { 
     params[i] = String.class; 
    } else if (obj[i] instanceof EnumType) { 
     params[i] = EnumType.class; 
    } 
} 

Class<?> cls = null; 
Method testMethod = null; 

try { 
    cls = Class.forName(className); 
    testMethod = cls.getDeclaredMethod(testMethodName, params); 
} catch (NoSuchMethodException e1) { 
    e1.printStackTrace(); 
} catch (SecurityException e1) { 
    e1.printStackTrace(); 
} catch (ClassNotFoundException e1) { 
    e1.printStackTrace(); 
} 

Object resultTest = null; 
try { 
     resultTest = testMethod.invoke(cls.newInstance(),obj); 
} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException | InstantiationException e) { 
    e.printStackTrace(); 
} 

if (resultTest != null) { 
    System.out.println(" Result: " + resultTest.toString()); 
} 

しかし、私は次のエラーを取得します:

java.lang.IllegalAccessException: Class com.myproject.testpackage.TestTemplate$1$1 can not access a member of class com.myproject.mypackage.ProdClass with modifiers "private" 
at sun.reflect.Reflection.ensureMemberAccess(Unknown Source) 
at java.lang.Class.newInstance(Unknown Source) 
at com.myproject.testpackage.TestTemplate$1$1.run(TestTemplate.java:264) 
at java.lang.Thread.run(Unknown Source) 

私には専用のコンストラクタがあるためです。 誰かがコンストラクターをパブリックにすることなく問題を解決する方法を知っていますか?

ありがとうございます。

+1

反射オブジェクトモデルのどこかで利用できる 'setAccessible'機能がありますと

 resultTest = testMethod.invoke(cls.newInstance(),obj); 

を交換してみてください。 – Bathsheba

+0

静的メソッドを呼び出すときにインスタンスを渡す必要はないことに注意してください。ちょうど 'null'を渡すのは、そのインスタンスが静的メソッドには使用されないためです。したがって、メソッドがstatic( 'Modifier.isStatic(testMethod.getModifiers())')の場合、コンストラクタを呼び出す必要はありません。 'testMethod.invoke(null、params)'を実行するだけです。 – Thomas

+0

偉大な、それは動作します! 私は間違いを理解しています。 – user3347007

答えて

0

試してみてください。

Constructor constructor = cls.getConstructor(); 
constructor.setAccessible(true); 
constructor.newInstance(); 
+0

あなたは私より12秒早かった – toongeorges

1

 Constructor constructor = constructor.getConstructor(); 
     constructor.setAccessible(true); 
     resultTest = testMethod.invoke(constructor.newInstance(),obj); 
関連する問題