0

如何通过反射将方法参数 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;
}
4

1 回答 1

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

我还没有测试代码是否编译,但你明白了。

于 2013-10-18T21:04:17.063 回答