java se 学习笔记 之 reflection(在类外部调用private成员的方式)5

来源:互联网 发布:全景效果图制作软件 编辑:程序博客网 时间:2024/06/06 01:52

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{//目标操作类PrivatePrivate 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 stubPrivate p = new Private();Class<?> c = p.getClass();Field field = c.getDeclaredField("name");//压制java对修饰符的检查,让该private成员属性对外可见field.setAccessible(true);//压制java对修饰访问符的检查//修改目标对象p中的属性fieldfield.set(p, "zhangsan");System.out.println(p.getName());}}

 

以上,所有的reflection(反射机制)就结束了!大家可以多沟通,相互学习!