反射

反射的基石---Class類

如何得到各個字節碼對應的實例對象( Class類型)
類名.class,例如,System.class
對象.getClass(),例如,new Date().getClass()
Class.forName("類名"),例如,Class.forName("java.util.Date");
九個預定義Class實例對象:
參看Class.isPrimitive方法的幫助
Int.class == Integer.TYPE


反射就是把Java類中的各種成分映射成相應的java類。

Constructor類

Constructor類代表某個類中的一個構造方法
得到某個類所有的構造方法:
例子:Constructor [] constructors= Class.forName("java.lang.String").getConstructors();
得到某一個構造方法:
例子:      Constructor constructor = Class.forName(“java.lang.String”).getConstructor(StringBuffer.class);
 //獲得方法時要用到類型
創建實例對象:
通常方式:String str = new String(new StringBuffer("abc"));
反射方式: String str = (String)constructor.newInstance(new StringBuffer("abc"));
 //調用獲得的方法時要用到上面相同類型的實例對象
Class.newInstance()方法:
例子:String obj = (String)Class.forName("java.lang.String").newInstance();
該方法內部先得到默認的構造方法,然後用該構造方法創建實例對象。
該方法內部的具體代碼是怎樣寫的呢?用到了緩存機制來保存默認構造方法的實例對象。
 

Field類

Field類代表某個類中的一個成員變量
演示用eclipse自動生成Java類的構造方法
問題:得到的Field對象是對應到類上面的成員變量,還是對應到對象上的成員變量?類只有一個,而該類的實例對象有多個,如果是與對象關聯,哪關聯的是哪個對象呢?所以字段fieldX 代表的是x的定義,而不是具體的x變量。
示例代碼:
 ReflectPoint point = new ReflectPoint(1,7);
 Field y = Class.forName("cn.itcast.corejava.ReflectPoint").getField("y");
 System.out.println(y.get(point));
 //Field x = Class.forName("cn.itcast.corejava.ReflectPoint").getField("x");
        x值的修飾符爲private,需要用到暴力反射
       1)獲得getDeclaredField("x");2)設置可獲取x.setAccessible(true);
 Field x = Class.forName("cn.itcast.corejava.ReflectPoint").getDeclaredField("x");
 x.setAccessible(true);
 System.out.println(x.get(point));
作業:將任意一個對象中的所有String類型的成員變量所對應的字符串內容中的"b"改成"a"。


 public class ReflectPoint {
 private int x;
 public  int y;
 public String str1 = "ball";
 public String str2 = "bassball";
 public String str3 = "wang";
 
 public ReflectPoint(int x, int y) {
  super();
  this.x = x;
  this.y = y;
 }

 @Override
 public String toString() {
  return "ReflectPoint [str1=" + str1 + ", str2=" + str2 + ", str3="
    + str3 + "]";
 }
 
}
 

public class ReflextTest {

 /**
  * @param args
  */
 public static void main(String[] args) throws Exception{
  // TODO Auto-generated method stub

  ReflectPoint rPoint1 = new ReflectPoint(2, 3);
  changeBToA(rPoint1);
  System.out.println(rPoint1);
 }
 
 public static void changeBToA(Object point) throws Exception{
  Field[] fields = point.getClass().getFields();
  for (Field field : fields) {
   if(field.getType() == String.class){
    //
    String oldString = (String) field.get(point);
    String newString = oldString.replace('b', 'a');
    field.set(point, newString);
   }
  }
  
 }

}
 

結果:ReflectPoint [str1=aall, str2=aassaall, str3=wang]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章