使用interface作为参数调用private方法

时间:2010-06-07 19:19:41

标签: java reflection

我一直在尝试调用一个私有方法,它的参数是一个参数,而我似乎无法正确理解它。

以下是代码到目前为止的样子:

public class TestClass {
   public TestClass(){
   }

   private void simpleMethod( Map<String, Integer> testMap) {
      //code logic
   }
}

然后我尝试使用它来调用私有方法:

//instance I would like to invoke simpleMethod on
TestClass testClassObject = new TestClass();

//Hashmap
Map <String, Integer> testMap = new HashMap <String, Integer>();

//method I want to invoke
Method simpleMethod = TestClass.class.getDeclaredMethod("simpleMethod", Map.class);
simpleMethod.setAccessible(true);

simpleMethod.invoke(testClassObject, testMap); //Throws an IllegalArgumentException 

如您所见,它会抛出IllegalArgumentException。我试图将hashmap转换回地图,但这不起作用。

我做错了什么?

3 个答案:

答案 0 :(得分:3)

我刚刚测试了它,并且当我实例化你的TestClass对象时,你的代码在这里工作100%正常:

TestClass testClassObject = new TestClass();

也许您正在使用不同的导入(例如,与java.util.Map不同的地图)?

答案 1 :(得分:1)

一切都按预期工作,并打印“simpleMethod invoked”。

TestClass.java

import java.util.Map;

public class TestClass {
    public TestClass() {
    }
    private void simpleMethod(Map<String, Integer> testMap) {
        System.err.println("simpleMethod invoked");
    }
}

Caller.java

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;

public class Caller {
    public static void main(String[] args) throws IllegalArgumentException,
            IllegalAccessException, InvocationTargetException,
            SecurityException, NoSuchMethodException {
        // Hashmap
        Map<String, Integer> testMap = new HashMap<String, Integer>();

        // method I want to invoke
        Method simpleMethod = TestClass.class.getDeclaredMethod("simpleMethod",
                Map.class);
        simpleMethod.setAccessible(true);

        TestClass testClassObject = new TestClass();
        simpleMethod.invoke(testClassObject, testMap);
    }
}

答案 2 :(得分:1)

发布的代码对我来说很好。稍微调整一下代码,当testMap为null时,我得到一个IllegalArgumentException。 “参数数量错误”。