1. 程式人生 > >Java反射的定義以及獲取class物件的三種方式

Java反射的定義以及獲取class物件的三種方式

1、什麼是反射技術?

java反射機制是在執行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個物件,都能夠呼叫它的任意一個方法和屬性。

應用程式已經執行,無法在其中進行new物件的建立,就無法使用物件。這時可以根據配置檔案的類全名去找對應的位元組碼檔案(class檔案),並載入進記憶體,並建立該類物件例項。這就需要使用反射技術。

2、獲取class物件的三種方式

獲取Class物件的方式一:

通過物件具備的getClass方法(源於Object類的方法)。有點不方便,需要用到該類,並建立該類的物件,再呼叫getClass方法完成。
Person p = new Person();//建立Peron物件
Class clazz = p.getClass();//通過object繼承來的方法(getClass)獲取Person對應的位元組碼檔案物件

獲取Class物件的方式二:
        每一個型別都具備一個class靜態屬性,通過該屬性即可獲取該類的位元組碼檔案物件。比第一種簡單了一些,僅用一個靜態屬性就搞定了。但是,還是有一點不方便,還必須要使用到該類。
Class clazz = Person.class;

獲取Class物件方式三:
         * 去找找Class類中是否有提供獲取的方法呢?
         * 找到了,static Class forName(className);
         * 相對方便的多,不需要直接使用具體的類,只要知道該類的名字即可。
         * 而名字完成可以作為引數進行傳遞 ,這樣就可以提高擴充套件性。
         * 所以為了動態獲取一個類,第三種方式最為常用。 
    Class clazz = Class.forName("lx.test.bean.Person");//必須類全名

建立Person物件的方式
以前:

1,先載入cn.itcast.bean.Person類進記憶體。
2,將該類封裝成Class物件。 
3,根據Class物件,用new操作符建立cn.itcast.bean.Person物件。
4,呼叫建構函式對該物件進行初始化。 
cn.itcast.bean.Person p = new cn.itcast.bean.Person();

通過方式三:(此外還可以使用構造,構造可以指定引數---如String.class)
String className = "cn.itcast.bean.Person";
        1,通過forName()根據指定的類名稱去查詢對應的位元組碼檔案,並載入進記憶體。
        2,並將該位元組碼檔案封裝成了Class物件。
        3,直接通過newIntstance方法,完成該物件的建立。
        4,newInstance方法呼叫就是該類中的空引數建構函式完成物件的初始化。 

//1,根據名稱獲取其對應的位元組碼檔案物件
Class clazz = Class.forName(className);
//2,通過Class的方法完成該指定類的物件建立。
Object object = clazz.newInstance();//該方法用的是指定類中預設的空引數建構函式完成的初始化。