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
- }
- }