-
六、通過反射了解集合泛型的本質
1、通過Class和Method了解泛型的本質
2、Java集合中的泛型,是防止錯誤輸入的,只在編譯階段有效,繞過編譯機無效了
ArrayList list1 = new ArrayList();
ArrayList<String> list2 = new ArrayList<String>();
Class c1 = list1.getClass();
Class c2 = list2.getClass();
System.out.Println(c1 == c2);
打印出true,說明編譯后集合的泛型是去泛型化的
3、驗證
我們可以通過方法的反射來操作,繞過編譯
Method m = c1.getMethod("add",Object.class);
m.invoke(list2,100);//繞過編譯操作就繞過了泛型
System.out.println(list2.size());
打印出1,說明加進去了
此時就不能用foreach來遍歷了,否則會報類型轉換異常
查看全部 -
五、Java 方法反射的操作
1、如何獲取某個方法
方法名稱和方法參數列表才能唯一決定某個方法
先獲取該類的類類型
A a1 = new? A();
Class c = a1.getClass();
再通過類類型獲取具體的方法
c.getMethod("print",int.class,int.class);
c.getMethod("print",new Object[]{int.class,int.class});
2、方法反射的操作
Object obj = method.invoke(對象,參數列表);
Object obj = m.invoke(a1,10,20);
Object obj = m.invoke(a1,new Object[]{10,20});
如果該方法沒有返回值,則返回null,如果有返回值則返回具體的值
查看全部 -
四、Java獲取成員變量構造函數的信息
1、成員變量也是對象
是java.lang.reflect.Field的對象
Field類封裝了關于成員變量的操作
getFields()方法獲取的是所有的public的成員變量
getDeclaredField()方法獲取的是所有自己聲明的成員變量
field.getType()得到成員變量的類型的類類型
field.getName()得到成員變量的名稱
2、構造函數也是對象
是java.lang.reflect.Constructor的對象
getConstructors()獲取所有的Public的構造函數
getDeclaredConstructors()獲取所有的構造函數,構造方法必須是自己聲明的
constructor.getParameterTypes()得到構造函數的參數列表(參數列表的類類型)
當一個類中沒有定義構造函數時,系統會給該類中加一個默認的空參數的構造函數,方便該類初始化。只是該空構造函數是隱藏不見的。當在該類中自定義了構造函數,默認構造函數就沒有了。
構造函數不能繼承,因為子類繼承父類的時候,先運行父類構造函數;具體的說就是運行父類時就會先“調用”父類的構造函數,注意“調用”和繼承不是一個含義,實質上是“自動運行”。
查看全部 -
三、Java獲取方法信息
1、基本數據類型? ?void關鍵字? 都存在類類型
2、Class類的基本API操作
打印類的所有方法
查看全部 -
二、Java動態加載
1、Class.forName("類的全稱");
不僅表示了類的類類型,還代表了動態加載類
請區分編譯、運行
編譯時刻加載類是靜態加載、運行時刻加載類是動態加載
2、靜態加載
new 創建對象? 是靜態加載類,在編譯時刻就需要加載所有可能使用到的類
查看全部 -
可以寫一個接口,接口里面寫動態加載類的方法。以后要用到的每一個類都可以直接調用接口。查看全部
-
Class類的使用
通過類的累類型創建該類的對象實例。
Class c1 = Foo.Class();
或者
Class c2 = foo1.getClass();
或者
Class c3 = null;
try{
c3 = Class.ForName("com.namespace.classname");
}catch(ClassNotFoundException e){
}
????????classname c = (classname)c1.newInstance();
查看全部 -
//反射中獲取類名稱方式兩種
a.getName();//獲取全稱(帶報名,關鍵字除外)
a.getSimpleName(); //不帶包名的類名稱
//獲取類型的方法
a.getMethods();? ? //獲取類型所有public的函數,包括父類繼承的函數
a.getDeclaredMethods()? ?//獲取類自己聲明的方法,不包括父類的
a.getMethod("test");? ?//獲取類中指定的方法名稱
查看全部 -
New是靜態加載類,在編譯時刻就要加載所有可能用到的類查看全部
-
編譯時刻加載類是靜態加載類,運行時刻加載類是動態加載類查看全部
-
Java中集合的泛型,是防止輸入錯誤的,只在編譯階段有效,編譯之后就無效了!
查看全部 -
1、成員變量也是對象,是在java.lang.reflect.Field類,封裝了關于成員變量的操作
Field[]?fs?=?c.getFields();//獲取的是public的成員變量信息 Field[]?fs?=?c.getDeclaredFields();//獲取的是該類自己聲明的成員變量的信息
2、構造函數也是對象,java.lang.Constructor中封裝了構造函數的信息。
Constructor[]?cs?=?c.getConstructors//獲取所有的public的構造函數 Constructor[]?cs?=?c.gerDeclaredConstructors()//得到所有的構造函數
注:
?c.getInterfaces()//得到接口 ?c.getModifiers()//得到訪問權限 ?c.getPackage()//得到包名 ?c.getResource()//得到返回值 ?c.getSuperclass()//得到父類
想要的到類的信息,就必須先得到類的類類型
Class?c?=?Object.getClass();
查看全部 -
方法也是對象,方法是Method[]的對象
Method[]?ms?=?c.getMethods();//or?c.getDeclaredMethods()
Method類,方法對象
一個成員就是一個Method對象
getMedhods()方法取得是所有的public函數,包括父類繼承而來的
getDeclaredMethods()獲取的是所有該類自己聲明的方法,不問訪問權限
for(int?i?=?0;i<ms.length;i++){ ??//得到方法的返回值類型的類類型 ??Class?returnType?=?ms[i].getReturnType(); ??System.out.print(returnType.getName()+"?"); ??//得到方法的名稱 ??System.out.print(ms[i].getName()+"("); ??//獲取參數類型-->得到的是參數類表的類型的類類型 ??Class[]?paramType?=?ms[i].getParameterTypes(); ??for(Class?c1:paramType){ ????System.out.print(c1.getName()+","); ??} ??System.out.print(")"); }
查看全部 -
1、什么是動態加載?什么是靜態加載?
編譯時刻加載類是靜態加載類,運行時刻加載類是動態加載類
靜態加載類:new 創建對象。是靜態加載類,在編譯時刻就需要加載所有的可能使用到的類
通過動態加載類可以解決上述問題
動態加載類:
Class?c?=?Class.forName(args[0]); 功能接口?name?=?(功能接口?)c.newInstanc(); name.方法();
查看全部 -
Class.forName("類全稱")實現運行時的動態加載類
查看全部
舉報