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
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 荒野行动绑定的手机号停机了怎么办 不小心误点了爱奇艺扣款了怎么办 和别人吵架别人先骂你怎么办 自己人被带到了缅甸黑社会了怎么办 绝地求生忘记复制钥匙激活码怎么办 绝地求生买的钥匙激活码丢了怎么办 蓝河奶粉宝宝吃了不长肉怎么办 苹果ios版本太低激活不了怎么办 脸上被油烫伤了 起了水泡怎么办 皮肤被油烫伤起来个水泡怎么办 去泰国旅游没来得及兑换泰铢怎么办 游戏和安卓 不和 出现黑屏怎么办 邻居把垃圾放在楼梯口不丢怎么办 58热敏小票打印机口松了怎么办 王鹏的眼睛今天起疙瘩了怎么办 背包带子老从肩膀滑下来怎么办 绝地求生用手机流量更新不成怎么办 手机拍的视频在电脑上放不了怎么办 炉石传说手机点登陆游戏闪退怎么办 车到信号屏蔽区一键启动不了怎么办 王者荣耀战队活跃度满了怎么办 win10你的账户已被停用怎么办 电脑一键还原后一直黑屏怎么办? 被打了狂犬疫苗的狗咬伤怎么办 美版苹果7系统坏了怎么办 韩服的球球大作战网络不稳定怎么办 球球大作战号删了找不回来怎么办 队友传足球球的时候接不到怎么办 魅族手机中病毒锁机了怎么办? vbs打开是和文本文档一样怎么办 把电脑注册表删了电脑动不了怎么办 注册表删一项后电脑启动不了怎么办 解压过的过的软件安装包损坏怎么办 手机中病毒自动发短信扣费怎么办 苹果手机中的高德地图打不开怎么办 大晚上挂了别人的车怎么办 手机不兼容高版本微信怎么办 绝地求生右下角小地图变大了怎么办 杯孕当月做了C丁怎么办 玩全军出击手机发烫就出现卡怎么办 不小心买了彩虹六号肝帝版本怎么办