-
Class類的實例對象的三種表示方式(1)查看全部
-
用接口,調用類,實現動態加載查看全部
-
method.invoke(對象,參數列表)查看全部
-
class類的基本API操作查看全部
-
任何一個類都是Class的實例對象查看全部
-
動態加載 1、靜態加載類,是編譯時刻加載;動態加載類,是運行時刻加載 2、new創建對象:是靜態加載類,在編譯時刻就需要加載所有的【可能使用到的類】。有一個類有問題(如不存在),都不能通過編譯,會報錯。 3、通過Class.forName()方法【動態加載類】,可以用到一個類時,才進行加載。 【功能性的類盡量使用動態加載,并對新添的類實現功能性接口(標準),這樣就不用重新編譯】查看全部
-
加載類,區分編譯和運行查看全部
-
Class類 1.【靜態的成員,普通數據類型不是對象】 2.【類是java.lang.Class類的實例對象,這個對象表示這個類的類類型(class type) Class類的構造器是private的,所以我們不能創建Class的對象,只能由JVM來創建Class的對象?!?(1)Class c1 = 類名.class;(說明每個類(對象)都有一個隱含的靜態成員變量class) (2)Class c2 = 類的實例對象.getClass(); (3)Class c3 = Class.forName(類名); 一個類只有一個類類型(class type) 4.可以通過類類型來獲取一個類的實例對象: c1.newInstance() c1是A類的類類型,創建出A類的對象(此處c1為Foo的類類型,創建出Foo類的一個實例對象),因此根據得出的結果需要做強制類型轉換(不加那個 Foo 類型是可以的 ?但是編譯器會報警告 ?提示這里 等號兩邊的 類型不一樣) 類名 類的實例對象名稱 = (類名)c1.newInstance();前提是該類有無參構造方法。查看全部
-
1.我們寫的類是class類的對象 2.實例對象的三種表達方式 1)Class cl =Foo.class; 2)Class c2 =foo1.getClass(); 3)Class.forName(""); 3.類類型創建類的實例 Foo foo = (Foo)c1.newInstance(); 需要有無參構造方法查看全部
-
泛型的本質: 泛型只在編譯階段有效,繞過編譯就無效了! ----------------------------------------------------- ArrayList list = new ArrayList(); ArrayList<String> list1 = new ArrayList<String>(); list1.add("hello"); /* list1.add(20); 報錯,因為這是String類型的泛型,只能傳入String類型的參數*/ Class c1 = list.getClass(); Class c2 = list1.getClass(); System.out.print(c1 == c2);//輸出true 【說明】 反射的操作都是編譯之后的操作 c1 == c2 結果返回true說明編譯之后集合的泛型是去泛型化的 Java中集合的泛型,是防止錯誤輸入的只在編譯階段有效,繞過編譯就無效了 【驗證:我們可以通過方法的反射來操作,繞過編譯】 Method m = c2.getMethod("add",Object.class); m.invoke(list1,20);//繞過編譯操作就繞過了泛型 System.out.print(list1.size());//輸出2[之前添加了hello,現在添加了20,所以長度為2] 【注:這里只能用下面這種方式輸出】 System.out.print(list1);//輸出(hello,20) 如果采用for(String string :list1){ System.out.println(String); }這種方式就會報錯?。∫驗槟J以為輸出的應該全部是字符串~查看全部
-
方法的反射操作能幫我們做什么: 1)如何獲取【某個】方法: 方法名稱+方法參數列表才能唯一決定某個方法 ------------------------------------------------------- 1.獲取一個方法就是獲取類的信息,獲取類的信息首先要獲得類類型 A a1 = new A(); Class c = a1.getClass(); 2.獲取方法 (必須要名稱和參數列表來決定) /* c.getMethod(name,parameterType);//獲取public的方法 c.getDeclaredMethod(name,parameterType);//獲取自己聲明的方法 */ Method m = c.getMethod("print",new Class[]{int.class,int.class}); 或 Method m = c.getMethod("print",int.class,int.class); //該方法會拋異常,因為有可能該方法不存在 ------------------------------------------------------- 3)方法反射操作 method.invoke(對象,參數列 表); 【方法的反射操作是用m對象來進行方法調用,而不是用A類的a1實例對象來調用,但和a1.print()調用的效果完全相同】 //這里的Object o的值是:方法如果沒有返回值則為null,如果方法有返回值則為具體的返回值 Object o = m.invoke(a1,new Object[]{10,20}); 或 Object o = m.invoke(a1,new 10,20); //解釋: 原本是a1操作print,a1.print(10,10); 而現在print作為【方法對象】賦值給了m 【反射就是進行反操作】 所以這時候就由print方法對象來操作a1 而這里的print方法對象就是m, 因此,m.invoke(a1,Object[]{10,10})的含義就是m.invoke(操作對象,參數); 調無參方法的例子:Method m = c.getMethod(); m.invoke(a1);或 m.invoke(a1,new class[]{});查看全部
-
構造函數也是對象,java.lang.Constructor中封裝了構造函數的信息。 Constructor[] cs = c.getConstructors();//獲取所有的public構造函數方法 Constructor[] cs = c.getDecleardConstructors();//獲取所有的構造函數 for(Constructor constructor :cs){ System.out.print(constructor.getName()+"(");//但其實構造函數無返回值 //獲取構造函數的參數列表------->得到的是參數列表的類類型 Class[] paramTypes = constructor.getParameterTypes(); for(Class class1:paramTypes){ System.out.print(class.getName()+","); } System.out.println(+")"); } ---總之:----------------------------------------- 想要得到類的信息,就先要得到類的類類型,之后就可以獲得相關的信息了。查看全部
-
成員變量也是對象,這些成員變量是由java.lang.reflect.field下面的Field類封裝了成員變量的操作。 Filed[] fs = c.getFileds();//獲取所有public的成員變量的信息 Filed[] fs = c.getDeclaredFields();//獲取該類自己聲明的成員變量信息 for(Field field :fs){ Class FieldType = field.getType();//獲取成員變量的類型的類類型 String typeName = filedType.getName();//獲取成員變量類型的名稱 String fieldName = field.getName();//得到成員變量的名稱 System.out.println(typeName+""+fieldName); }查看全部
-
想要獲得類的一些信息可以采用如下方法: 【想要獲取類的信息,首先要獲取類的類類型】 1.獲取類的名稱 Class c = obj.getClass(); c.getName();//這里的c是由obj的類型決定,如果obj是Foo類型則c為Foo的類類型 2.獲取所有方法 【利用Method類(即方法對象)】 一個成員方法就是一個Method對象 Method[] ms = c.getMethods(); //getMethods()方法獲取的是所有public的函數,包括父類繼承而來的 Method[] ms = c.getDeclaredMethods(); //getDeclaredMethods()獲取的是所有自己聲明的方法,不問訪問權限 3.獲取方法名 Class returnType = ms[i].getReturnType();//得到方法的返回值類型的類類型 ms[i].getName();//獲取方法名 4.獲取參數類型【得到的是參數列表的類型的類類型】 Class[] paramTypes = ms[i].getParameterTypes(); for(Class class1:paramTypes){ System.out.print(class.getName()+","); }查看全部
-
編譯時刻加載類是靜態加載類,運行時刻加載類是動態加載類。 new對象是靜態加載類,在編譯時刻就需要加載所有的可能使用到的類。 通過動態加載類可以解決該問題 Class c = Class.forName(); //通過類類型創建該對象 OfficeAble a = (OfficeAble)c.newInstance(); 此處的OfficeAble為接口[標準],以后需要用的類只要實現該接口即可。 -------------------------------------------------------------- 一般來說,功能性的類使用動態加載而不是靜態加載查看全部
舉報
0/150
提交
取消