如何通过反射将方法参数com.ibm.as400.access.AS400JDBCConnection传递给以下方法:
private String test1(Connection con){
return "test1";
}
当我从JUnit传递到test1(con)时,我收到以下错误。 java.lang.NoSuchMethodException:com.action.TestAction.test1(com.ibm.as400.access.AS400JDBCConnection)
我创建了另一种方法:
private String test2(com.ibm.as400.access.AS400JDBCConnection con){
return "test2";
}
使用test2(con)运行,运行正常。 在不改变方法的情况下,在正确传递到test1时,任何输入都会非常受欢迎。
=============================================== ===========
以下是我提取的示例链接: Any way to Invoke a private method?
以下是我的JUnit测试:
@Test
public void testReturnScreen(){
System.out.println("connection: "+con.getClass());
System.out.println((String) genericInvokMethod(creditCardAction, "test2", 1, con));
System.out.println((String) genericInvokMethod(creditCardAction, "test1", 1, con));
}
public static Object genericInvokMethod(Object obj, String methodName,
int paramCount, Object... params) {
Method method;
Object requiredObj = null;
Object[] parameters = new Object[paramCount];
Class<?>[] classArray = new Class<?>[paramCount];
for (int i = 0; i < paramCount; i++) {
parameters[i] = params[i];
classArray[i] = params[i].getClass();
}
try {
method = obj.getClass().getDeclaredMethod(methodName, classArray);
method.setAccessible(true);
requiredObj = method.invoke(obj, parameters);
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
return requiredObj;
}
答案 0 :(得分:0)
如果con
的类型为AS400JDBCConnection,那么getDeclaredMethod(methodName, classArray)
将找不到任何内容,因为您的test1方法是使用Connection
形式参数定义的,因此它将抛出异常。
我认为您可以将genericInvokeMethod
改为:
public static Object genericInvokMethod(Object obj, String methodName, Object[] formalParams, Object[] actualParams) {
Method method;
Object requiredObj = null;
try {
method = obj.getClass().getDeclaredMethod(methodName, formalParams);
method.setAccessible(true);
requiredObj = method.invoke(obj, actualParams);
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
return requiredObj;
}
...并调用它:
System.out.println((String) genericInvokMethod(creditCardAction, "test1", new Object[]{Connection.class}, new Object[]{con}));
我还没有测试代码是否编译,但你明白了。