1. 目标操作类的定义如下
public class Private {
private String name="lisi" ;
public String getName(){
return name;
}
//定义一个私有的操作方法sayHello
private String sayHello(String name){
return "hello "+name;
}
}
2. 定义一个客户端类通过反射的方式来调用目标类Private中的私有成员(成员方法和成员变量),代码如下:
import java.lang.reflect.Method;
public class TestPrivate {
/**
* @param args
*/
public static void main(String[] args) throws Exception{
//目标操作类Private
Private p = new Private();
//通过 Private的对象p得到给类对应Class类的对象
Class<?> clazz = p.getClass();
//getMethod()只返回Public的方法
//getDeclaredMethods();可以返回所有的函数,包括private 的函数
Method method = clazz.getDeclaredMethod("sayHello",new Class[]{String.class});
//设置该方法可访问,设置为false时,则私有方法不可以访问,私有属性也是如此
//该行的目的是压制java访问权限检查器,不让其来进行访问权限的检查,让该方法可以被外部可见
method.setAccessible(true);
//执行目标对象的method方法,以Object对象数组的形式传入参数
String str = (String)method.invoke(p, new Object[]{"zhangsan"});
System.out.println(str);
}
}
3. 在客户端类中修改private的成员变量
import java.lang.reflect.Field;
public class TestPrivate2 {
/**
* @param args
*/
public static void main(String[] args) throws Exception{
// TODO Auto-generated method stub
Private p = new Private();
Class<?> c = p.getClass();
Field field = c.getDeclaredField("name");
//压制java对修饰符的检查,让该private成员属性对外可见
field.setAccessible(true);//压制java对修饰访问符的检查
//修改目标对象p中的属性field
field.set(p, "zhangsan");
System.out.println(p.getName());
}
}
以上,所有的reflection(反射机制)就结束了!大家可以多沟通,相互学习!