java基础巩固系列(三):成员变量反射的Field类
来源:互联网 发布:java实现dnf自动刷怪 编辑:程序博客网 时间:2024/05/16 19:44
要想使用反射,首先需要获得类对象所对应的Class类的类对象。一个Field对象对应的是一个反射类的属性(成员变量)信息
这里边有一个方法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.yint 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){//首先要判断得到的类型是不是Stringif(field.getType() == String.class){//把原本的变量值赋给oldValueString oldValue = (String)field.get(pt1);//把oldValue中字符为b的转换为字符为aString 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
0 0
- java基础巩固系列(三):成员变量反射的Field类
- 反射 --- 成员变量Field类的反射
- Java反射-使用Field类来操作类的成员变量(Field)
- java基础巩固系列(四):数组的反射应用
- 深入理解 Java 反射:Field (成员变量)
- 深入理解 Java 反射:Field (成员变量)
- 反射(成员变量Field和成员函数Method的反射)
- java基础--反射(成员变量)
- Java反射(三)Field
- java基础巩固之反射(一)
- java基础巩固之反射(二)
- Java类成员变量的反射
- java反射---获取类的成员变量
- 黑马程序员---java基础加强_成员变量的反射
- java 成员变量的反射
- 黑马程序员——反射之Field类 成员变量
- 类反射学习(三) JAVA如何利用类反射调用普通函数、访问成员成员变量
- java反射类成员变量
- vim设置大全
- 不使用中间变量,如何交换两个数
- 位运算妙用2
- Snippet Compiler——代码段编译工具
- Pure virtual destructor in C++
- java基础巩固系列(三):成员变量反射的Field类
- Python中的序列——列表和元组
- oracle生成uuid
- [申请选校话题]学校所在的地理位置未必是最重要的因素
- Linux下文件的三种时间标记:访问时间、修改时间、状态改动时间
- 解析instrument得trace文件
- DataGrid和DataGridComboBoxColumn数据绑定
- IOSAPP提示更新软件的功能的方法
- [Qt学习篇]小品QIODevice::Text参数