反射 - 将连接字段传递给私有方法

时间:2013-10-18 18:38:19

标签: java reflection junit

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

1 个答案:

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

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