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

  我這里說道的Field是由反射的開始,源代碼如下:

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;  
  
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);  
          

       }   }  

  這樣就利用了Field很塊的完成了任務。ok..........


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM