1.在java語言中,靜態(tài)的成員變量,普通數(shù)據(jù)類型類等等都是對象,類也是對象样勃,是java.lang.Class類的實例對象吠勘,任何一個類都是Class的實例對象性芬,稱為這個類的類類型,這個實例對象有三種表達方式
(1)Class c1=類名.class ?任何一個類都有一個隱含的靜態(tài)成員變量class
(2)Class c2=類的實例.getClass() ?知道該類的實例對象后用getClass()方法獲取
(3)Class c3=null;
c3=Class.forName("類的全稱");
c1=c2=c3剧防,都代表了這個類的類類型植锉,一個類只可能是Class類的一個實例對象,無論用哪種方法獲取的都是同一個,我們可以通過類的類類型來創(chuàng)建對象實例峭拘,比如:
Foo foo=(Foo)c1.newInstance() 得出來的結(jié)果進行強制類型轉(zhuǎn)換就可以得到對象實例俊庇,但前提是Foo類必須要有無參構(gòu)造方法
2.加載類
(1)c3=Class.forName("類的全稱")不僅僅代表了類的類類型,還代表了動態(tài)加載類鸡挠,編譯時刻加載類是靜態(tài)加載類辉饱,運行時刻是動態(tài)加載類
(2)new創(chuàng)建類是靜態(tài)加載類,在編譯時刻就需要加載所有的可能用到的類拣展,所以任何一個類出現(xiàn)問題都無法編譯成功
(3)動態(tài)加載類在運行時加載彭沼,可能用到的類出錯在編譯時不會報錯,只有在用到時才會報錯备埃,但所有可能用到的類必須繼承同一個接口才能方便調(diào)用
3.基本的數(shù)據(jù)類型姓惑,void關鍵字也有類類型
Class c1=int.class;
Class c2=String.class;
Class c3=void.class;
4.方法也是對象,方法對象屬于java.lang.reflect.Method類,一個成員變量就是一個Method類對象
Class c=obj.getClass();
c.getName();//獲取類的名稱
Method[] ms=c.getMethods();//獲取所有的public函數(shù)的方法對象按脚,包括從父類繼承來的
而getDeclaredMethods()獲取的是所有該類自己聲明的方法于毙,不問訪問權(quán)限,但不包括父類繼承來的
5.成員變量也是對象辅搬,.成員變量對象屬于java.lang.reflect.Field類,用法與方法對象類似
6.構(gòu)造函數(shù)也是對象唯沮,java.lang.Constructor中封裝了構(gòu)造函數(shù)的信息,用法類似:
7.獲取一個方法的信息
首先獲取類的類類型伞辛,如:Class c1=類名.class
通過方法名稱和參數(shù)來獲取烂翰,如:Method m=c.getMethod("方法名",new Class[]{int.class,int.class})
或Method m=c.getMethod("方法名"蚤氏,int.class,int.class)
方法的反射操作:通過m對象來調(diào)用方法甘耿,與用對象實例調(diào)用效果相同,例:
m.invoke(a1,new Object[]{10,20))(a1為對象實例竿滨,new Object[]{10,20)為方法參數(shù)佳恬,沒有可不寫或為空new Object[]{}),效果等同于a1.方法名(10,20)于游,如果有返回值毁葱,返回的是Object對象,要進行強制類型轉(zhuǎn)換
8.java中反射的操作都是編譯后的操作贰剥,而java中集合的泛型倾剿,是防止錯誤輸入的,只在編譯階段有效,繞過編譯就無效了前痘,所以編譯之后集合的泛型是去泛型化的凛捏,所以繞過編譯可以繞過泛型