-
Class.forName("類的全稱") 表示:1動態加載類 2類類型 編譯:靜態加載類 new屬于靜態加載類 在編譯時會加載所有用到的類 運行:動態加載類 只在運行期才會去關心里面的類有沒有 解決: 當設計實現時,使用接口來實現具體類,Class c=Class.forName("com.entity.Office"); OfficeBetter oa=(OfficeBetter)c.newInstance(); 用接口來接收返回查看全部
-
內容概要: Class類的使用 方法的反射 成員變量的反射 構造函數的反射 java類加載機制查看全部
-
Java反射機制——通過反射了解集合泛型的本質 1:反射的操作都是編譯之后的操作;就是運行階段 2:編譯之后集合是去泛型化的,Java中集合的泛型,是防止錯誤輸入的,只在編譯階段有效,繞過編譯就無效了; 3:反射的操作、Class的操作、Method操作、Field的操作都是編譯后的操作。 我們可以通過方法的反射來操作,繞過編譯 eg: ArrayList list1=new ArrayList(); ArrayList<String> list2=new ArrayList<String>(); Class c1=list1.getClass(); Class c2=list2.getClass(); System.out.print(c1==c2);//true Method m=c2.getMethod("add",Object.class); m.invoke(list2,20);//向list2集合中添加一個int 型的值;繞過編譯 當然是不能直接foreach list2集合的,會報類型轉換錯誤查看全部
-
如何獲取某個方法:方法的【名稱】和【方法的參數列表】才能【唯一確定】某個方法 1、要獲取一個類的某個方法,需要先得到類類型 2、通過Class.getMethod(name,parameterTypes)獲得public的該方法:如c.getMethod("print",new Class[]{int.class,int.class})或者參數寫成int,int; ——> 來獲取 public void print(int a,int b) 3、同樣getDeclaredMethdo(name,paramterTypes)獲得自己聲明的該方法 二:方法的反射操作;就是用method對象進行方法調用;當然還是需要傳參的 method.invoke(對象實例,參數列表) 2.1:invoke(user,new Object[]{10,20})倘若沒有參數就可省略:invoke(user) 2.2:invoke(user,10,20)//直接傳參查看全部
-
Java反射機制——獲取成員變量&構造函數 一、成員變量是java.lang.reflect.Field的對象 1、Field類封裝了關于成員變量的操作 2、Field[] fs = c.getFields()方法獲取所有public的成員變量Field[]信息 3、c.getDeclaredFields獲取的是該類自己聲明的成員變量信息 4、field.getType()獲得成員類型的類類型 5、field.getName()獲得成員的名稱 二、構造函數是java.lang.Constructor類的對象 1、通過Class.getConstructor()獲得Constructor[]所有公有構造方法信息 2、建議getDeclaredConstructors()獲取自己聲明的構造方法 3、Constructor.getName():String 4、Constructor.getParameterTypes():Class[] 萬物皆對象 為什么查看全部
-
/** * 打印類的信息,包括類的成員函數、成員變量(只獲取成員函數) * @param obj 該對象所屬類的信息 */ public static void printClassMethodMessage(Object obj){ //要獲取類的信息 首先要獲取類的類類型 Class c = obj.getClass();//傳遞的是哪個子類的對象 c就是該子類的類類型 //獲取類的名稱 System.out.println("類的名稱是:"+c.getName()); /* * Method類,方法對象 * 一個成員方法就是一個Method對象 * getMethods()方法獲取的是所有的public的函數,包括父類繼承而來的 * getDeclaredMethods()獲取的是所有該類自己聲明的方法,不問訪問權限 */ Method[] ms = c.getMethods();//c.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[] paramTypes = ms[i].getParameterTypes(); for (Class class1 : paramTypes) { System.out.print(class1.getName()+","); } System.out.println(")"); } }查看全部
-
使用new創建對象 是靜態加載類,在編譯時刻就需要加載所有的可能用到的類; 而使用動態加載類則是運行時加載所需的類,動態類加載:Class.forName("類的全稱"); 此種編碼方式 適用于:軟件功能升級查看全部
-
Class類 1)在面向對象的世界里,萬事萬物皆對象。 類是對象,類是java.lang.Class類的實例對象。 There is a class named Class 2)//Foo的實例對象如何表示 Foo foo1=new Foo();//foo1就表示出來了 //Foo這個類也是一個實例對象,Class類的實例對象,如何表示呢? //任何一個類都是Class的實例對象,這個實例對象有三種表示方式 //第一種表示方式--->實際在告訴我們任何一個類都有一個隱含的靜態成員變量class Class c1=Foo.class; //第二種表達方式--->已經知道該類的對象通過getClassF方法 Class c2=foo1.getClass(); //官網c1,c2表示了Foo類的類類型(class type),萬事萬物皆對象,類也是對象,是Class類的實例對象 //這個對象我們稱為該類的類類型 //不管c1 or c2都代表了Foo類的類類型,一個類只可能是Class類的一個實例對象 //第三種表達方式 Class c3=null; c3=Class.forName("com.imooc.reflect.Foo"); //我們完全可以通過類的類類型創建類的對象實例--->通過c1 or c2 or c3創建Foo的實例對象 Foo foo=(Foo)c1.newInstance();//需要有無參數的構造方法查看全部
-
Class類的三種表示方式: 1:類名.class 2: 對象.getClass() 3: Class.forName("類的全稱")查看全部
-
動態加載類,不管該類存不存在,都可以通過編譯,當運行的時候有該類就可以了 很經典啊, Office of=Class.forName(args[0]); OfficeAble oa=(OfficeAble)of.newInstance();查看全部
-
new是靜態加載類,編譯時需要編譯所有的類,動態加載類查看全部
-
OfficeAble接口查看全部
-
1.Class.forName("類的全稱")不僅表示了類得類類型,還代表了動態加載類 編譯時刻加載類是靜態加載類、運行時刻加載類是動態加載。 2.new 創建對象是靜態加載類,在編譯時刻就需要加載所有的可能使用到的類;通過動態加載類可以實現這個問題 Class c = Class.forName(args[0]); 通過類類型,創建該類對象。 OfficeAble oa=(OfficeAble)c.newInstance();//在此之前應該定義個接口Interface OfficeAble,并且讓子類實現它。 oa.start(); 。。。。在編譯時Word.java需要重新編譯,而OfficeBetter.java不需要,每次添加新的功能的時候只用編譯使用了接口的子類,然后運行時輸入 java OfficeBetter Word,這時oa是Word類 3.在線升級用的就是動態加載類。功能性的類,要使用動態加載,而不能使用靜態加載。查看全部
-
1、靜態加載類,是編譯時刻加載;動態加載類,是運行時刻加載 2、new創建對象:是靜態加載類,在編譯時刻就需要加載所有的【可能使用到的類】。有一個類有問題(如不存在),都不能通過編譯,會報錯。查看全部
-
區分編譯和運行查看全部
舉報
0/150
提交
取消