java - 反射 - 如何从java类外部调用私有方法

我有一个Dummy类,它有一个叫做sayHello的私有方法,我想从Dummy外部调用sayHello ,我认为它应该是反射,但是,我得到一个IllegalAccessException ,有什么办法?

时间:

使用方法对象的invoke方法之前对它使用setAccessible(true)


import java.lang.reflect.*;


class Dummy{


 private void foo(){


 System.out.println("hello foo()");


 }


}



class Test{


 public static void main(String[] args) throws Exception {


 Dummy d = new Dummy();


 Method m = Dummy.class.getDeclaredMethod("foo");


 //m.invoke(d);// throws java.lang.IllegalAccessException


 m.setAccessible(true);// Abracadabra 


 m.invoke(d);// now its OK


 }


}



首先你用类是相当直接的,然后使用名称获取方法,然后需要将方法设置为对象上的setAccessible方法可访问。


 Class<?> clazz = Class.forName("test.Dummy");



 Method m = clazz.getDeclaredMethod("sayHello");



 m.setAccessible(true);



 m.invoke(new Dummy());




method = object.getClass().getDeclaredMethod(methodName);


method.setAccessible(true);


method.invoke(object);



如果你想将任何参数传递给私有函数,你可以将它传递为第二,第三,调用函数的参数,下面是例子代码。


Method meth = obj.getClass().getDeclaredMethod("getMyName", String.class);


meth.setAccessible(true);


String name = (String) meth.invoke(obj,"Green Goblin");



你可以看到的完整例子这里

使用java反射访问私有方法(带参数)的例子如下:


import java.lang.reflect.Field;


import java.lang.reflect.InvocationTargetException;


import java.lang.reflect.Method;


class Test


{


 private void call(int n) //private method


 {


 System.out.println("in call() n:"+ n);


 }


}


public class Sample


{


 public static void main(String args[]) throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchFieldException


 {


 Class c=Class.forName("Test"); //specify class name in quotes


 Object obj=c.newInstance();



 //----Accessing private Method


 Method m=c.getDeclaredMethod("call",new Class[]{int.class}); //getting method with parameters


 m.setAccessible(true);


 m.invoke(obj,7);


 }


}



...