java 反射 Field类

来源:互联网 发布:如何理解云计算的特点 编辑:程序博客网 时间:2024/04/30 03:43

java 反射 Field类

挺好的例子

转载自:http://www.360doc.com/content/11/1231/14/1954236_176297236.shtml

例子1.

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

例子2.


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 Pointpublic class ReflectTest {public static void main(String[] args) throws Exception {Point pt1 = new Point(3,5);//get all fieldsField[] 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
原创粉丝点击