for java beginner10 java 反射 Field类

java 反射 Field类

-------用到一个bean
package com.ncs;

public class Point {

private int x;
public int y;

public Point(int x, int y) {
super();
this.x = x;
this.y = y;
}

}

--------------------
package com.ncs;

import java.lang.reflect.Field;

//need another bean Point
public class ReflectTest {
//★这里说的Field都是 类 身上的,不是实例上的
public static void main(String[] args) throws Exception {

Point pt1 = new Point(3,5);

//得到一个字段
Field fieldY = pt1.getClass().getField("y"); //y 是变量名
//fieldY的值是5么?? 大错特错
//fieldY和pt1根本没有什么关系,你看,是pt1.getClass(),是 字节码 啊
//不是pt1对象身上的变量,而是类上的,要用它取某个对象上对应的值
//要这样
System.out.println(fieldY.get(pt1)); //这才是5

//现在要x了

/*
Field fieldX = pt1.getClass().getField("x"); //x 是变量名
System.out.println(fieldX.get(pt1));
*/

//运行 报错 私有的,找不到
//NoSuchFieldException
//说明getField 只可以得到 公有的
//怎么得到私有的呢??

/*
Field fieldX = pt1.getClass().getDeclaredField("x"); //这个管你公的私的,都拿来
//然后轮到这里错了
// java.lang.IllegalAccessException:
//Class com.ncs.ReflectTest can not access a member of class com.ncs.Point with modifiers "private"
System.out.println(fieldX.get(pt1));
*/

//三步曲 一是不让你知道我有钱 二是把钱晃一下,不给用 三是暴力抢了

//暴力反射
Field fieldX = pt1.getClass().getDeclaredField("x"); //这个管你公的私的,都拿来
fieldX.setAccessible(true);//上面的代码已经看见钱了,开始抢了
System.out.println(fieldX.get(pt1));

//out 3 OK!!


}
}

---------------------------下面做的小实验,把一个类里所有String类型的字段里的值 b 变 a

package com.ncs;

public class Point {

private int x;
public int y;

public String s1 ="ball";
public String s2="hubin";
public String s3="zhangxiaoxiang";
//做实验而已,字段不可能是 public 的

public Point(int x, int y) {
super();
this.x = x;
this.y = y;
}

}

----------------------------
package com.ncs;

import java.lang.reflect.Field;

//need another bean Point
public class ReflectTest {

public static void main(String[] args) throws Exception {

Point pt1 = new Point(3,5);

//get all fields
Field[] fields = pt1.getClass().getFields();

for(Field field : fields ) {
//我说的是String 类型的字段,当然要选择一下
//if(field.getType().equals(String.class)) {
//字节码都是一份的,干什么用equals啊
if(field.getType()== String.class) {
String oldValue = (String)field.get(pt1);
String newValue = oldValue.replace('b', 'a');
//改 对象的字段
field.set(pt1, newValue);

}
}

System.out.println(pt1.s1);
System.out.println(pt1.s2);
System.out.println(pt1.s3);

//aall
//huain
//zhangxiaoxiang

}
}

---------------------------------
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值