java學習之反射詳細應用

 

 

 

    String str="abc";

     Class cls1=str.getClass();

     Class cls2=String.class;

     Class cls3= Class.forName("java.lang.String");

     System.out.println(cls1==cls2);

     System.out.println(cls2==cls3);

     System.out.println(cls1.isPrimitive());

     System.out.println(int.class.isPrimitive());

     System.out.println(int.class==Integer.class);

     System.out.println(int.class==Integer.TYPE);

     System.out.println(int[].class.isPrimitive());//基本類型

     System.out.println(int[].class.isArray());//數組

 

 

  輸出結果:

 true

true

false

true

false

true

false

true

 

構造函數的反射運用:

 

   Constructor constroctor1 = String.class.getConstructor(StringBuffer.class);

     String str2= (String)constroctor1.newInstance(new StringBuffer("abc"));

     System.out.println(str2.charAt(2));

輸出 c

 

通過反射取 變量

 

 

 

 ReflectPoint pt1=new ReflectPoint(3,5);

     Field fieldY= pt1.getClass().getField("y");//共有類型用getField()

     //fieldY不是某個對象身上的變量,而是類上,要用它去取某個對象上對應的值

     System.out.println(fieldY);

     System.out.println(fieldY.get(pt1));

     Field fieldX= pt1.getClass().getDeclaredField("x");//私有類型用getDeclaredField()

     fieldX.setAccessible(true);

     System.out.println(fieldX.get(pt1));

 

 

 

 

 

public class ReflectPoint {

   private int x;

   public int y;

   public String str1="ball";

   private String str2="basketball";

   public String str3="itcast";

public ReflectPoint(int x, int y) {

super();

this.x = x;

this.y = y;

}

@Override

public String toString(){

return str1+":"+str2+":"+str3;

}

 

}

 

 

輸出

 public int cn.itcast.day1.ReflectPoint.y

5

3

 

函數的反射

 

 

 Method methodCharAt= String.class.getMethod("charAt", int.class);

     System.out.println(methodCharAt.invoke(str, 1));

     System.out.println(methodCharAt.invoke(str, new Object[]{2}));

 

   構造函數的反射

 

     String startClassName=args[0];

     Method mainMethod=Class.forName(startClassName).getMethod("main",String[].class);

     mainMethod.invoke(null, new Object[]{new String[]{"111","222","333"}});

     mainMethod.invoke(null, (Object)new String[]{"111","222","333"});

 

 

輸出:

 b

 c

111

222

333

 

編寫一個函數 傳進一個對象,如果這個對象的String類型的變量裏有含有b則用 a替換

 

 

private static void changeStringValue(Object obj) throws Exception {

// TODO Auto-generated method stub

  Field[] fields= obj.getClass().getFields();

  for(Field field:fields)

  {

    if(field.getType()==String.class)

     {

       String oldValue= (String)field.get(obj);

       String newValue= oldValue.replace('b', 'a');

        field.set(obj, newValue);

     }

  }

}

 

 

 

public class ReflectPoint {

   private int x;

   public int y;

   public String str1="ball";

   private String str2="basketball";

   public String str3="itcast";

public ReflectPoint(int x, int y) {

super();

this.x = x;

this.y = y;

}

@Override

public String toString(){

return str1+":"+str2+":"+str3;

}

 

 

 

changeStringValue(pt1);

     System.out.println(pt1);

 

 

輸出:

 

 aall:basketball:itcast

 

這個方法只能替換 public類型的String變量,如果是private 則不能獲得變量的值,無法替換;私有類型用getDeclaredField()

發佈了28 篇原創文章 · 獲贊 5 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章