1.在java語言中,靜態的成員變量,普通數據類型類等等都是對象,類也是對象,是java.lang.Class類的實例對象,任何一個類都是Class的實例對象,稱為這個類的類類型,這個實例對象有三種表達方式
(1)Class c1=類名.class ?任何一個類都有一個隱含的靜態成員變量class
(2)Class c2=類的實例.getClass() ?知道該類的實例對象后用getClass()方法獲取
(3)Class c3=null;
c3=Class.forName("類的全稱");
c1=c2=c3,都代表了這個類的類類型,一個類只可能是Class類的一個實例對象,無論用哪種方法獲取的都是同一個,我們可以通過類的類類型來創建對象實例,比如:
Foo foo=(Foo)c1.newInstance() 得出來的結果進行強制類型轉換就可以得到對象實例,但前提是Foo類必須要有無參構造方法
2.加載類
(1)c3=Class.forName("類的全稱")不僅僅代表了類的類類型,還代表了動態加載類,編譯時刻加載類是靜態加載類,運行時刻是動態加載類
(2)new創建類是靜態加載類,在編譯時刻就需要加載所有的可能用到的類,所以任何一個類出現問題都無法編譯成功
(3)動態加載類在運行時加載,可能用到的類出錯在編譯時不會報錯,只有在用到時才會報錯,但所有可能用到的類必須繼承同一個接口才能方便調用
3.基本的數據類型,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函數的方法對象,包括從父類繼承來的
而getDeclaredMethods()獲取的是所有該類自己聲明的方法,不問訪問權限,但不包括父類繼承來的
5.成員變量也是對象,.成員變量對象屬于java.lang.reflect.Field類,用法與方法對象類似
6.構造函數也是對象,java.lang.Constructor中封裝了構造函數的信息,用法類似:
7.獲取一個方法的信息
首先獲取類的類類型,如:Class c1=類名.class
通過方法名稱和參數來獲取,如:Method m=c.getMethod("方法名",new Class[]{int.class,int.class})
或Method m=c.getMethod("方法名",int.class,int.class)
方法的反射操作:通過m對象來調用方法,與用對象實例調用效果相同,例:
m.invoke(a1,new Object[]{10,20))(a1為對象實例,new Object[]{10,20)為方法參數,沒有可不寫或為空new Object[]{}),效果等同于a1.方法名(10,20),如果有返回值,返回的是Object對象,要進行強制類型轉換
8.java中反射的操作都是編譯后的操作,而java中集合的泛型,是防止錯誤輸入的,只在編譯階段有效,繞過編譯就無效了,所以編譯之后集合的泛型是去泛型化的,所以繞過編譯可以繞過泛型