java基础巩固系列(三):成员变量反射的Field类
2014-08-22 21:01
471 查看
要想使用反射,首先需要获得类对象所对应的Class类的类对象。一个Field对象对应的是一个反射类的属性(成员变量)信息
这里边有一个方法Field.setAccessible(Boolean b),这个方法很重要,在代码里边有注释,是用来提高java反射速度的。
首先,我们需要定义一个javaBean,这个bean用来作为我们的反射类:
我们下边做一个反射的小李子,就是通过反射技术把另一个类中的String类型成员变量中字符为'b'的改变为‘a'
下边是main函数
得到的结果为:
aall
aasketaall
lipenglong
这里边有一个方法Field.setAccessible(Boolean b),这个方法很重要,在代码里边有注释,是用来提高java反射速度的。
首先,我们需要定义一个javaBean,这个bean用来作为我们的反射类:
<span style="font-family:Microsoft YaHei;font-size:12px;">package com.test; public class Point { private int x; public int y; public Point(int x,int y){ super(); this.x = x; this.y = y; } } </span>然后,我们就在main里边写具体的反射方法了:
<span style="font-family:Microsoft YaHei;font-size:12px;">package com.test; import java.lang.reflect.Field; public class ReflectTest { public static void main(String []args) throws Exception{ Point pt1 = new Point(3, 5); //这里的得到的fieldY是类上的一个字段(成员变量),不是实例pt1上的y的值 Field fieldY = pt1.getClass().getField("y"); System.out.println(fieldY); //输出结果:public int com.test.Point.y int num = fieldY.getInt(pt1); //这里得到的是pt1实例上边的变量y的值 System.out.println(num); //输出结果:5 //因为成员变量x是private的,所以按照如上的方法是不能够取得x的值的 //因为我们需要用到暴力反射 Field fieldX = pt1.getClass().getDeclaredField("x"); //这里的getDeclaredField()方法,是获得类上的字段,无论是公有还是私有的 fieldX.setAccessible(true); /**将此对象的 accessible 标志设置为指示的布尔值。 * 值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查。值为 false 则指示反射的对象应该实施 Java 语言访问检查。 */ //PS:setAccessible是启用和禁用访问安全检查的开关,并不是为true就能访问为false就不能访问 //通过setAccessible(true)的方式关闭安全检查就可以达到提升反射速度的目的 System.out.println(fieldX.get(pt1)); } } </span>注意,在上边对类私有成员变量x反射的时候会用到setAccessible()方法,对此在代码里边有具体的解释。
我们下边做一个反射的小李子,就是通过反射技术把另一个类中的String类型成员变量中字符为'b'的改变为‘a'
<span style="font-family:Microsoft YaHei;font-size:12px;">package com.test; public class Point { public String s1="ball"; public String s2 = "basketball"; public String s3="lipenglong"; } </span>
下边是main函数
<span style="font-family:Microsoft YaHei;font-size:12px;">package com.test; import java.lang.reflect.Field; public class ReflectTest { public static void main(String []args) throws Exception{ Point pt1 = new Point(); //首先得到所有方法的一个Field数组 Field[] fields = pt1.getClass().getFields(); for(Field field : fields){ //首先要判断得到的类型是不是String if(field.getType() == String.class){ //把原本的变量值赋给oldValue String oldValue = (String)field.get(pt1); //把oldValue中字符为b的转换为字符为a String newValue = oldValue.replace('b', 'a'); //给pt1赋新的值 field.set(pt1, newValue); } } System.out.println(pt1.s1); System.out.println(pt1.s2); System.out.println(pt1.s3); } } </span>
得到的结果为:
aall
aasketaall
lipenglong
相关文章推荐
- Java基础---基础加强---增强for循环、自动拆装箱及享元、枚举的作用、实现带有构造方法、透彻分析反射的基础_Class类、成员变量的反射、数组参数的成员方法进行反射、数组的反射应用
- 黑马程序员--Java基础加强--16.利用反射操作泛型V【通过Constructor反射解析泛型构造方法】【通过Field反射解析泛型成员变量】【个人总结】
- 黑马程序员---java基础加强_成员变量的反射
- java基础巩固系列(四):数组的反射应用
- 【基础技术】Java基础那些事儿系列-成员变量与局部变量
- Java基础---基础加强---增强for循环、自动拆装箱及享元、枚举的作用、实现带有构造方法、透彻分析反射的基础_Class类、成员变量的反射、数组参数的成员方法进行反射、数组的反射应用
- java基础--反射(成员变量)
- 使用java 反射,对类中成员变量赋值.将Json对像转为Java对像
- 黑马程序员_Java基础_面向对象(概述、类与对象关系、成员变量、封装private、构造函数和构造代码块、this关键字)
- 在上篇,as3反射基础上,实现,类对象成员变量批量复制
- Java 反射学习(二)成员变量的反射
- Java基础--反射(成员方法)
- 使用java反射操作类的构造函数,成员变量和成员方法
- 反射 --- 成员变量Field类的反射
- Java通过反射访问私有成员变量和私有方法
- java利用反射来调用一个类的私有方法和成员变量
- 反射基础---成员变量反射应用,字符替换
- 第2章 Java编程基础——FAQ2.13 成员变量和局部变量有什么区别?
- java 成员变量的反射
- java 反射机制 读取私有成员变量