本帖最后由 qianji20000420 于 2017-8-5 21:54 编辑
通过反射获取成员变量并遍历 通过反射修改成员变量的值 通过反射获取修改私有成员变量
|
|
|
在第二篇我有讲过如何获取Class文件对象,所以我就不再过多的进行阐述了
先创建两个类 这里我已经写好了Demo_01主方法 及test_01的三个不同权限修饰符的成员变量
然后我们翻看api,找啊找 终于找到了这两个和成员变量有关的方法
那稍微理解一下应该第一个方法是获取单个Field对象,下面的是获取所有的Field对象
然后我用了一下下面那个方法 Field[] f = test.getFields(); 然后遍历一下 发现只遍历到了一个Field对象,为什么呢? 我们继续翻看API
原来是两条漏网之鱼
现在把Declared加上再遍历试试
恩,这就没问题了
那如何获取这个变量的值呢?
首先我们先写一个构造方法,并实例化一个新的对象
这里我为了简便先用链式编程了。 - test_01 cc= (test_01) test.getConstructor(String.class, int.class, double.class).newInstance("fff", 5, 5d);
复制代码然后我想获取那个String值怎么办呢?
我们先看一下api 发现在Field类中有
那在这之前呢 我先获取那个String字段所对应的Field对象 - Field f = test.getDeclaredField("a");
复制代码那个“a” 即为变量名
然后我们通过输出 System.out.println(f.get(cc)); yeah!
|
|
|
通过查询API中Field类的方法可以看到
我们还是按照之前的那个写法 - public class Demo_01 {
- public static void main(String[] args) throws Exception {
- Class<?> test = Class.forName("indi.Tshoiasc.reflect.test_01");
- test_01 cc = (test_01)
- test.getConstructor(String.class, int.class, double.class).newInstance("fff", 5, 5d);
- Field f = test.getDeclaredField("a");
- }
- }
- class test_01 {
-
- public String a;
- int b;
- private double c;
-
- public test_01(String a, int b, double c) {
- this.a = a;
- this.b = b;
- this.c = c;
- }
- }
复制代码再main中Field f = test.getDeclaredField("a");下面在加一句 - f.set(cc, "b");
- System.out.println(cc.a);
复制代码这回我们会发现
已经成功了。 |
|
|
当我们把镜头移到private double c;(啪,哪有钱买镜头)
好吧,我们在主方法中这样写 - Field f = test.getDeclaredField("c");
- f.set(cc, 1d);
- System.out.println(cc.getC());
复制代码运行,果不其然,IllegalAccessException
相比看完第二篇的你已经猜到了吧
在set上一句放上f.setAccessible(true);就可以正常修改啦!
获取就不用我讲了吧~ 只要setAccessible之后和公共的一样哦 |
|
|
反射中对成员方法的调用
返回索引贴
第一次做教程,如果教程中有遗漏的或说错的地方请及时指出哇。~ |
|
|
[groupid=1181]Unknown Domain[/groupid]