java反射詳解

1、理解Class類java

一、java程序中的各個java類屬於一類事物,描述這類事物的java類名就叫作Class數組

二、Class類表明java類,而他的各個對象表明各個類在內存中的字節碼。一個類被類加載器加載到內存中,佔用內存一片空間,這個空間裏的內容就是類的字節碼。不一樣類的字節碼是不一樣的。因此他們在內存裏的內容是不一樣的。這一個個空間分別用一個個對象來表示,這裏的對象就是Class類的對象緩存

三、如何獲得Class類型(類的字節碼)ui

類名.class,例如,System.class
對象.getClass(),例如,new Date().getClass()
Class.forName("類名"),例如,Class.forName("java.util.Date");this

 Point point = new Point();

  Class clazz1 = point.getClass();

  Class clazz2 = Point.class;

  Class clazz3 = Class.forName("test.java.com.day1.Point");

  System.out.println(clazz1==clazz2);//輸出true

  System.out.println(clazz1==clazz3);//輸出true

例一、判斷是否是數組code

String[] a= new String[]{"1","2","3"};

  if(a.getClass().isArray()){

   System.out.println(Arrays.asList(a));

  }

2、反射對象

一、什麼是反射內存

反射就是將java類中的各個成分映射成相應的java類字符串

例如,一個java程序中的java類用一個Class類的對象來表示,一個類中的組成部分:成員變量,方法,構造方法,包等等信息也用一個個的Java類來表示,就像汽車是一個類,汽車中的發動機,變速箱等等也是一個個的類。表示java類的Class類顯然要提供一系列的方法,來得到其中的變量,方法,構造方法,修飾符,包等信息,這些信息就是用相應類的實例對象來表示,它們是Field、Method、Contructor、Package等等。
二、Constructor類get

Constructor類表明某個類中的一個構造方法

//獲得某個類的全部構造方法
  Constructor[] constructors = Class.forName("java.lang.String").getConstructors();
  //獲得某個構造方法
  Constructor constructor = Class.forName("java.lang.String").getConstructor(StringBuilder.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類表明某個類中的一個成員變量

class Point{
 private int pointx=0;
 private int pointy=1;
}
Field fieldx = Point.class.getField("pointx");
  System.out.println(fieldx.get(new Point()));
  
  Field fieldy = Point.class.getDeclaredField("pointy");
  fieldy.setAccessible(true);
  System.out.println(fieldy.get(new Point()));
/**
 * 將任意一個對象中的全部String類型的成員變量所對應的字符串內容中的"b"改爲"a"。
 * @author chenweisong
 *
 */
class Stringreplace{
 private  String a = "abstract";
 public String b = "aabbcccbf";
 int c=2;
 
 public String toString(){
  System.out.println(a+"\r\n"+b+"\r\n"+c);
  return null;
 }
 
 public void replaceAll() throws Exception{
  Field[] fields = Stringreplace.class.getDeclaredFields();
  for(Field field:fields){
   field.setAccessible(true);
   if(field.getType()==java.lang.String.class){
    String str = (String)field.get(this);
    field.set(this, str.replace("b", "a"));
   }
  }
  System.out.println(this);
  
 }
}

四、Method類表明某個類中的一個成員方法

 //獲得一個類的方法

  Method charAt = Class.forName("java.lang.String").getMethod("charAt", int.class);

  String str = "abc";

  System.out.println(str.charAt(1));

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

五、數組的反射

具備相同維數和元素類型的數組屬於同一個類型,即具備相同的Class實例對象。表明數組的Class實例對象的getSuperClass()方法返回的父類爲Object類對應的Class。基本類型的一維數組能夠被看成Object類型使用,不能看成Object[]類型使用;非基本類型的一維數組,既能夠當作Object類型使用,又能夠當作Object[]類型使用。

相關文章
相關標籤/搜索