Java反射是可以讓我們?cè)谶\(yùn)行時(shí)獲取類的函數(shù)、屬性伴挚、父類靶衍、接口等Class內(nèi)部信息的機(jī)制。通過反射還可以讓我們?cè)谶\(yùn)行期實(shí)例化對(duì)象茎芋,調(diào)用方法颅眶,通過調(diào)用get/set方法獲取變量的值,即使方法或?qū)傩允撬接械囊部梢酝ㄟ^反射的形式調(diào)用田弥。
反射Class以及構(gòu)造對(duì)象
如果你在編譯期知道一個(gè)類的名字涛酗,那么你可以使用如下的方式獲取一個(gè)類的Class對(duì)象
Class<?> myClass=Student.class;
如果你在編譯期得到了某個(gè)對(duì)象,但是你想獲取這個(gè)對(duì)象的Class對(duì)象,那么你可以通過如下的形式來獲取Class 對(duì)象
Student me=new Student("hansheng");
Class<?> class=me.getClass();
如果你在編譯期獲取不到目標(biāo)類型商叹,但是你知道他的完整類路徑燕刻,那么你可以通過如下的形式來獲取Class對(duì)象
Class<?> myClass=Class.forName("com.hansheng");
接口說明
//加載完整路徑
public static Class<?> forName(String className)
通過Class對(duì)象構(gòu)造目標(biāo)類型的對(duì)象
在java中藥構(gòu)造對(duì)象,必須通過該類的構(gòu)造函數(shù)剖笙,那么其實(shí)反射也是如此卵洗。通過反射構(gòu)造對(duì)象,我們首先獲取類的Constructor(構(gòu)造器)對(duì)象枯途,然后通過Constructor來創(chuàng)建目標(biāo)類的對(duì)象忌怎。
//獲取class對(duì)象
Class<?> clazz=Class.forName("com.hansheng");
//通過class對(duì)象獲取Constructor,Student的構(gòu)造函數(shù)有一個(gè)字符串函數(shù),這里需要傳遞參數(shù)的類型
Constructor<?> constructor =clazz.getConstructor(String.class);
//通過Constructor來創(chuàng)建Student對(duì)象
Object obj=constructor.newInstance("hansheng");
System.out.println("obj:"+obj.toStirng());
獲取構(gòu)造函數(shù)的接口
public constructor<T> getConstructor(Class...<?>paramterTypes)