-
Class類的實例對象如何表示查看全部
-
class查看全部
-
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類查看全部
-
class類查看全部
-
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)//直接傳參查看全部
-
打印類的信息,包括類的成員方法、成員變量以及構造方法(這里只顯示成員方法,其它類似): 只要在類里面聲明的都有類類型 public static void pringClassMessage(Object object){ //要獲取類的信息,首先要獲取類的類型 Class c=object.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.println(returnType.getName()); //得到方法名 System.out.println(ms[i].getName()+"("); //獲取參數類型-->得到的是參數列表的類型的類類型 Class[] paramType=ms[i].getParameterTypes(); for (Class class1: paramType) { System.out.println(class1.getName()+","); } System.out.println(")"); } } }查看全部
-
java反射--------獲取方法信息 一、基本的數據類型,void關鍵字等都存在類類型 Class c = 基類.class (int,String,double,void等) 二、Class類的基本API操作的 1、class.getName()可以獲取類的名稱 2、class.getSimpleName();//不包含包名的類的名稱 3、class.getMethods()獲取類的【public方法】集合,【包括繼承來的】 4、class.getDeclaredMethods()獲取的是所有該類【自己聲明】的方法,【不問訪問權限】 三、Method類提供了一些操作方法的方法 1、Method.getName()得到方法的名稱 2、Method.getReturnType()得到該方法的返回值類型的類類型(class),如int.class String.class 3、Method.getParameterTypes()獲得參數列表類型的類類型數組class【】,如參數為(int,int)則得到(int.class ,int class) ********注意【所有方法都是Method類的對象】**************** 例子: Class c1 = int.class; int的類類型 Class c2 = String.class; String類的類類型 String類字節碼 Class c3 = double.class; double這個數據類類型的字節碼表示方式 Class c4 = Double.class; Double這個類的類類型字節碼表示方式 Class c5 = void.class; 表達了void這個類的類類型 getName為這個類的類類型的具體名稱 c1.getName ---> int c2.getName ---> java.lang.String 類的全稱 c2.getSimpleName ---> String 不包含包名的類的名稱查看全部
-
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[]查看全部
-
@Java反射機制——動態加載類 1、靜態加載類,是編譯時刻加載;動態加載類,是運行時刻加載 2、new創建對象:是靜態加載類,在編譯時刻就需要加載所有的【可能使用到的類】。有一個類有問題(如不存在),都不能通過編譯,會報錯。 3、Class.forName()通過動態加載類,可以用到一個類時,才進行加載。 【功能性的類盡量使用動態加載,并對新添的類實現功能性接口(標準),這樣就不用重新編譯】 動態加載類實例: Class c = Class.forName(args[0]); 通過類類型,創建該類對象。 OfficeAble oa=(OfficeAble)c.newInstance(); oa.start(); 定義個接口Interface OfficeAble,讓子類實現它。 在線升級用的就是動態加載類。 功能性的類,要使用動態加載,而不能使用靜態加載。查看全部
-
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 c1 = int.class; Class c2 = String.class; (可以關鍵字.class 類名.class) 基本數據類型 void等關鍵字都存在類類型 System.out.println(c2.getSimpleName);// 不含包名的類類型名稱 //要獲取類信息 首先獲取類類型 public static void printClassMessage(Object obj){ Class c = obj.getClass();//傳遞的是哪個子類的對象 c就是該子類的類類型 } //接下來獲取類的名稱 用 getName();來獲取類的名稱 //獲取方法 方法是Method的對象 一個成員方法就是一個Method對象 getMethod()方法獲取的是所有public的函數 包括父類繼承而來的 getDeclaredMethod()方法獲取的是該類自己聲明的方法 不問訪問權限查看全部
-
1.Class.forName("類的全稱")不僅表示了類得類類型,還代表了動態加載類<br> 編譯時刻加載類是靜態加載類、運行時刻加載類是動態加載。<br> 2.new 創建對象是靜態加載類,在編譯時刻就需要加載所有的可能使用到的類; 一個錯誤就會導致編譯失敗,通過動態加載類可以解決這個問題<br> Class c = Class.forName(args[0]);<br> 通過類類型,創建該類對象。<br> OfficeAble oa=(OfficeAble)c.newInstance();//在此之前應該定義個接口Interface OfficeAble,并且讓子類實現它。<br> oa.start();<br> 。。。。在編譯時Word.java需要重新編譯,而OfficeBetter.java不需要,每次添加新的功能的時候只用編譯使用了接口的子類,然后運行時輸入 java OfficeBetter Word,這時oa是Word類<br> 3.在線升級用的就是動態加載類。功能性的類,要使用動態加載,而不能使用靜態加載。查看全部
-
1.Class類<br> 1) 在面向對象的世界里,萬事萬物皆對象。(java語言中,靜態的成員、普通數據類型除外)<br> 類是不是對象呢?類是(哪個類的對象呢?)誰的對象呢?<br> 類是對象,類是java.lang.Class類的實例對象<br> 2)這個對象到底如何表示<br> 三種表示Class的實例對象,1.類.class 2.類對象.getClass(); 3. Class.forName("類的全稱") 通過類的類類型創建該類的對象實例 Foo foo=(Foo)c1.newInstance(); 需要有無參數的構造方法 foo.Foo方法(); 3 )Class.forName("類的全稱")<br> 不僅表示了,類的類類型,還代表了動態加載類<br> 請大家區分編譯、運行<br> 編譯時刻加載類是靜態加載類、運行時刻加載類是動態加載類<br> 4)基本的數據類型<br> void關鍵字 都存在類類型 <br> 5)Class類的基本API操作<br> <br> 2.方法的反射<br> 1)如何獲取某個方法<br> 方法的名稱和方法的參數列表才能唯一決定某個方法<br> 2)方法反射的操作<br> method.invoke(對象,參數列表)<br> 3)為什么要用方法的反射<br> why?指定方法名稱調用方法<br> 舉個實際應用的案例 ---->通過標準JavaBean的屬性名獲取其屬性值<br> BeanUtil類<br> 4)通過Class,Method來認識泛型的本質查看全部
舉報
0/150
提交
取消