调用private方法时出现Java InvocationTargetException

时间:2015-10-19 07:45:24

标签: java reflection

我有一个带有这种签名的私有方法:

private void compressFilesForSend(List<File> files, File archiveFile)

我希望通过反射

在测试中调用它
Class[] parameterTypes = new Class[2];
        parameterTypes[0] = java.util.List.class;
        parameterTypes[1] = java.io.File.class;

        Method method = SendDB.class.getDeclaredMethod("compressFilesForSend",parameterTypes);
        method.setAccessible(true);
        method.invoke(files, archiveFile);

Stacktrace:

java.lang.NoSuchMethodException: com.m1_mm.tools.SendDB.compressFilesForSend(java.util.ArrayList, java.io.File)
    at java.lang.Class.getDeclaredMethod(Class.java:2130)
    at com.m1_mm.tools.SendDBTest.compressFilesForSendTest1(SendDBTest.java:55)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)

如何调用此方法?

2 个答案:

答案 0 :(得分:2)

你的Method.invoke签名错了。您需要传递要调用方法的实例,然后传递参数。

你所做的就是告诉它在files上调用方法,传递archiveFile作为参数;换句话说,你正在做

files.compressFilesForSend(archiveFile);

但将files视为SendDB的实例。

您需要确定要调用方法的SendDB实例,并将其作为第一个参数传递:

method.invoke(mySendDbInstance, files, archiveFile);

答案 1 :(得分:0)

问题是您传递的files参数是ArrayList,但方法签名表示您需要List参数。

List<File> files = new ArrayList<File>;    //it's ok
ArrayList<File> files = new ArrayList<File>;    //it's not ok