本帖最后由 qianji20000420 于 2017-8-5 21:54 编辑

导读

  • 通过反射获取成员变量并遍历
  • 通过反射修改成员变量的值
  • 通过反射获取修改私有成员变量


获取成员变量的值

在第二篇我有讲过如何获取Class文件对象,所以我就不再过多的进行阐述了
先创建两个类 这里我已经写好了Demo_01主方法 及test_01的三个不同权限修饰符的成员变量

然后我们翻看api,找啊找 终于找到了这两个和成员变量有关的方法

那稍微理解一下应该第一个方法是获取单个Field对象,下面的是获取所有的Field对象
然后我用了一下下面那个方法
Field[] f = test.getFields();
然后遍历一下
发现只遍历到了一个Field对象,为什么呢? 我们继续翻看API

原来是两条漏网之鱼

现在把Declared加上再遍历试试

恩,这就没问题了
那如何获取这个变量的值呢?
首先我们先写一个构造方法,并实例化一个新的对象
这里我为了简便先用链式编程了。
  1. test_01 cc= (test_01) test.getConstructor(String.class, int.class, double.class).newInstance("fff", 5, 5d);
复制代码
然后我想获取那个String值怎么办呢?
我们先看一下api 发现在Field类中有

那在这之前呢 我先获取那个String字段所对应的Field对象
  1. Field f = test.getDeclaredField("a");
复制代码
那个“a” 即为变量名
然后我们通过输出
System.out.println(f.get(cc));
yeah!



修改成员变量的值

通过查询API中Field类的方法可以看到

我们还是按照之前的那个写法
  1. public class Demo_01 {
  2. public static void main(String[] args) throws Exception {
  3. Class<?> test = Class.forName("indi.Tshoiasc.reflect.test_01");
  4. test_01 cc = (test_01)
  5. test.getConstructor(String.class, int.class, double.class).newInstance("fff", 5, 5d);
  6. Field f = test.getDeclaredField("a");  
  7.    }
  8. }

  9. class test_01 {
  10.      
  11.    public String a;
  12.    int b;
  13.   private double c;

  14.   
  15.       public test_01(String a, int b, double c) {
  16.                 this.a = a;
  17.                 this.b = b;
  18.                 this.c = c;
  19.         }

  20. }
复制代码
再main中Field f = test.getDeclaredField("a");下面在加一句
  1. f.set(cc, "b");
  2. System.out.println(cc.a);
复制代码
这回我们会发现

已经成功了。



获取并修改私有变量

当我们把镜头移到private double c;(啪,哪有钱买镜头)
好吧,我们在主方法中这样写
  1. Field f = test.getDeclaredField("c");
  2. f.set(cc, 1d);
  3. System.out.println(cc.getC());
复制代码
运行,果不其然,IllegalAccessException
相比看完第二篇的你已经猜到了吧
在set上一句放上f.setAccessible(true);就可以正常修改啦!

获取就不用我讲了吧~  只要setAccessible之后和公共的一样哦



下一篇

反射中对成员方法的调用
返回索引贴
第一次做教程,如果教程中有遗漏的或说错的地方请及时指出哇。~
[groupid=1181]Unknown Domain[/groupid]