最近開(kāi)始找早新的工作涕侈,在面試中曾有面試管問(wèn)我對(duì)java的反射是否了解。我想了想煤辨,開(kāi)發(fā)1年多來(lái)裳涛,工作中有聽(tīng)說(shuō)過(guò)反射,也大概了解一些众辨,但由于之前自己并沒(méi)有對(duì)此做過(guò)深入的研究端三,所以回答的不是很好。常言道鹃彻,在哪里跌倒郊闯,在哪里爬起。于是我開(kāi)始了學(xué)java反射的學(xué)習(xí),現(xiàn)將學(xué)習(xí)收獲記錄如下团赁。
在java面向?qū)ο蟮氖澜缋镉Γ磺薪詫?duì)象。而在我沒(méi)有對(duì)java反射進(jìn)行深入學(xué)習(xí)之前然痊,對(duì)于一個(gè)有著一年多android開(kāi)發(fā)經(jīng)驗(yàn)的我竟然不知其實(shí)java中的類(lèi)也是對(duì)象至朗。我相信,對(duì)于java反射了解得比較少甚至不了解的同學(xué)來(lái)說(shuō)剧浸,可能也同樣存在這樣的一個(gè)誤區(qū)的認(rèn)識(shí)吧锹引。好了,長(zhǎng)話短說(shuō)唆香,下面就讓我們來(lái)學(xué)習(xí)學(xué)習(xí)Java中的反射吧嫌变。
首先必須明確一個(gè)概論:類(lèi)是對(duì)象,類(lèi)是java.lang.Class類(lèi)的實(shí)例對(duì)象躬它。
Class類(lèi)
Class.forName("類(lèi)的全稱”)
- 上面語(yǔ)句包含兩個(gè)含義:不僅表示了類(lèi)的類(lèi)類(lèi)型腾啥,還代表了動(dòng)態(tài)加載類(lèi)
- 需要區(qū)分編譯和運(yùn)行:編譯時(shí)刻加載的類(lèi)是靜態(tài)加載類(lèi),運(yùn)行時(shí)刻加載的類(lèi)是動(dòng)態(tài)加載類(lèi)冯吓。泛型只在編譯時(shí)起作用倘待,繞過(guò)編譯就等于欸有泛型。
基本數(shù)據(jù)類(lèi)型组贺、引用數(shù)據(jù)類(lèi)型凸舵、void關(guān)鍵字、Void 都存在類(lèi)類(lèi)型失尖,注意:null關(guān)鍵字不存在類(lèi)類(lèi)型
任何一個(gè)類(lèi)都是Class的實(shí)例對(duì)象啊奄,這個(gè)實(shí)例對(duì)象有三種表示方式(例如Dog類(lèi))
public class Dog {
public print(int a,int b)
{
System.out.println("sum="+(a+b));
}
}
Dog dog = new Dog();
- 第一種方式:通過(guò)類(lèi).class獲取
Class c1 = Dog.class;//實(shí)際是在告訴我們?nèi)魏我粋€(gè)類(lèi)都有一個(gè)隱含的靜態(tài)成員變量class - 第二種方式:通過(guò)類(lèi)的一個(gè)實(shí)例對(duì)象的getClass()方法去獲取
Class c2 = dog.getClass(); - 第三種方式:通過(guò)動(dòng)態(tài)加載方式獲取
Class c3 = Class.forName("類(lèi)的全名稱");//需要捕獲異常
一個(gè)類(lèi)只能有一個(gè)類(lèi)類(lèi)型,因此c1==c2,c2==c3,c1==c3都應(yīng)該是true掀潮,它們?cè)趦?nèi)存中指向同一片內(nèi)存地址菇夸。
Class類(lèi)的基本API操作
通過(guò)反射調(diào)用對(duì)象的方法
public transient Method java.lang.Class.getMethod(String s, Class aclass[])
public transient Object java.lang.reflect.Method.invoke(Object obj, Object aobj[])
如調(diào)用dog對(duì)象的print方法:
Dog dog = new Dog(); Class c = dog.getClass(); Method m = c.getMethod("print", int.class,int.class);
//方法的反射操作
//通過(guò)方法對(duì)象去調(diào)用dog對(duì)象的對(duì)應(yīng)方法
//方法的反射操作是用m對(duì)象來(lái)進(jìn)行方法調(diào)用 和dog.print調(diào)用的效果完全相同
//方法如果沒(méi)有返回值返回null,有返回值返回具體的返回值
Object o = m.invoke(dog , 2,4);
參考:imooc 反射——Java高級(jí)開(kāi)發(fā)必須懂的