动态调用私有域和私有方法
2017-11-30 本文已影响0人
鉴闻俗说
1、定义一个含私有方法的类
public class PrivateMethod
{
private String name;
private String sayHello()
{
return "Hello " + name + "!";
}
public String getName()
{
return name;
}
}
2、动态调用该私有方法。注意在动态调用私有方法的过程中,必须压制java的访问检查,否则在调用私有域或私有方法的时候会出现无法访问的错误。
import java.lang.reflect.Method;
/**
* 动态调用私有方法
*
*/
public class TestPrivateMethod
{
public static void main(String[] args) throws Exception
{
PrivateMethod p =new PrivateMethod();
Class<?> classType = p.getClass();
//此处用getDeclaredField可以获取私有域,getField只可以得到公有域
Field field = classType.getDeclaredField("name");
/**
* 压制java的访问检查,true为压制;false为按照原来的策略进行,既不压制。
* 此处必须压制,否则下面的调用发生访问私有域失败
*/
field.setAccessible(true);
field.set(p, "Tom");
System.out.println(p.getName());
//此处用getDeclaredMethod可以获取私有方法,getMethod只可以得到公有方法
Method method = classType.getDeclaredMethod("sayHello", new Class[] {});
/**
* 压制java的访问检查,true为压制;false为按照原来的策略进行,既不压制。
* 此处必须压制,否则下面的调用发生访问私有方法失败
*/
method.setAccessible(true);
String str = (String)method.invoke(p, new Object[] {});
System.out.println(str);
}
}