当方法的参数是List时,如何通过Reflection调用私有方法?

时间:2014-09-02 14:41:12

标签: java reflection

如何通过Reflection API调用私有方法?

我的代码

public class A {
    private String method(List<Integer> params){
        return "abc";
    }
}

并测试

public class B {
    public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        Class<A> clazz = A.class;
        Method met = clazz.getMethod("method", List.class);
        met.setAccessible(true);
        String res = (String) met.invoke("method", new ArrayList<Integer>());
        System.out.println(res);
    }
}

2 个答案:

答案 0 :(得分:7)

您的代码中存在两个问题

  • 您使用的getMethod只能返回public种方法,以便私人使用getDeclaredMethod
  • 您正在"method"文字而不是A类的实例上调用您的方法(String没有此方法,因此您无法在其实例上调用它 - 类似于{{1是不正确的。)

您的代码应该是

"method".method(yourList)

答案 1 :(得分:0)

如果您也需要通过反射来创建A的实例,则可以通过这种方式进行操作

 public static void main(String[] args) throws Exception {
    Class<?> aClass = A.class;
    Constructor<?> constructor = aClass.getConstructors()[0];
    Object a = constructor.newInstance(); // create instance of a by reflection
    Method method = a.getClass().getDeclaredMethod("method", List.class); // getDeclaredMethod for private
    method.setAccessible(true); // to enable accessing private method
    String result = (String) method.invoke(a, new ArrayList<Integer>());
    System.out.println(result);
  }