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