java 反射 Field类 

-------用到一个bean 

Java代码  收藏代码
  1. package com.ncs;  
  2.   
  3. public class Point {  
  4.   
  5.     private int x;  
  6.     public int y;  
  7.       
  8.     public Point(int x, int y) {  
  9.         super();  
  10.         this.x = x;  
  11.         this.y = y;  
  12.     }  
  13.       
  14. }  

-------------------- 

Java代码  收藏代码
  1. package com.ncs;  
  2.   
  3. import java.lang.reflect.Field;  
  4.   
  5. //need another bean Point  
  6. public class ReflectTest {  
  7.     //★这里说的Field都是 类 身上的,不是实例上的  
  8.     public static void main(String[] args) throws Exception {  
  9.           
  10.         Point pt1 = new Point(3,5);  
  11.           
  12.         //得到一个字段  
  13.         Field fieldY = pt1.getClass().getField("y"); //y 是变量名  
  14.         //fieldY的值是5么?? 大错特错  
  15.         //fieldY和pt1根本没有什么关系,你看,是pt1.getClass(),是 字节码 啊  
  16.         //不是pt1对象身上的变量,而是类上的,要用它取某个对象上对应的值  
  17.         //要这样  
  18.         System.out.println(fieldY.get(pt1)); //这才是5  
  19.           
  20.         //现在要x了  
  21.           
  22.         /*  
  23.         Field fieldX = pt1.getClass().getField("x"); //x 是变量名 
  24.         System.out.println(fieldX.get(pt1));  
  25.         */  
  26.           
  27.         //运行 报错 私有的,找不到  
  28.         //NoSuchFieldException  
  29.         //说明getField 只可以得到 公有的  
  30.         //怎么得到私有的呢??  
  31.           
  32.         /* 
  33.         Field fieldX = pt1.getClass().getDeclaredField("x"); //这个管你公的私的,都拿来 
  34.         //然后轮到这里错了 
  35.         // java.lang.IllegalAccessException: 
  36.         //Class com.ncs.ReflectTest can not access a member of class com.ncs.Point with modifiers "private" 
  37.         System.out.println(fieldX.get(pt1)); 
  38.         */  
  39.           
  40.         //三步曲 一是不让你知道我有钱 二是把钱晃一下,不给用  三是暴力抢了  
  41.           
  42.         //暴力反射    
  43.         Field fieldX = pt1.getClass().getDeclaredField("x"); //这个管你公的私的,都拿来  
  44.         fieldX.setAccessible(true);//上面的代码已经看见钱了,开始抢了  
  45.         System.out.println(fieldX.get(pt1));   
  46.           
  47.         //out 3 OK!!  
  48.           
  49.           
  50.     }  
  51. }  


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

Java代码  收藏代码
  1. package com.ncs;  
  2.   
  3. public class Point {  
  4.   
  5.     private int x;  
  6.     public int y;  
  7.       
  8.     public  String s1 ="ball";  
  9.     public String s2="hubin";  
  10.     public String s3="zhangxiaoxiang";  
  11.     //做实验而已,字段不可能是 public 的  
  12.       
  13.     public Point(int x, int y) {  
  14.         super();  
  15.         this.x = x;  
  16.         this.y = y;  
  17.     }  
  18.       
  19. }  


---------------------------- 

Java代码  收藏代码
  1. package com.ncs;  
  2.   
  3. import java.lang.reflect.Field;  
  4.   
  5. //need another bean Point  
  6. public class ReflectTest {  
  7.       
  8.     public static void main(String[] args) throws Exception {  
  9.           
  10.         Point pt1 = new Point(3,5);  
  11.           
  12.         //get all fields  
  13.         Field[] fields = pt1.getClass().getFields();   
  14.           
  15.         for(Field field : fields ) {  
  16.             //我说的是String 类型的字段,当然要选择一下  
  17.             //if(field.getType().equals(String.class)) {  
  18.             //字节码都是一份的,干什么用equals啊  
  19.             if(field.getType()== String.class) {  
  20.                 String oldValue = (String)field.get(pt1);  
  21.                 String newValue = oldValue.replace('b', 'a');  
  22.                 //改 对象的字段  
  23.                 field.set(pt1, newValue);  
  24.                   
  25.             }  
  26.         }  
  27.           
  28.         System.out.println(pt1.s1);  
  29.         System.out.println(pt1.s2);  
  30.         System.out.println(pt1.s3);  
  31.           
  32.         //aall  
  33.         //huain  
  34.         //zhangxiaoxiang  
  35.   
  36.     }  
posted on 2015-08-11 15:58  AppleIsA  阅读(1480)  评论(1编辑  收藏  举报