-
Java高級開發-反射 萬事萬物皆為對象。 類是對象,類是java.lang.class Class類的實例對象 Clsaa c1=Foo.class; 任何一個類都含有一個靜態成員對象 Class c2=foot1.getClass(); 知道該類的對象通過getClass()方法 c1==c2 不管c1 c2都代表了Foo類的類類型,一個類只能是一個Class類的勢力對象 Class c3=null c3=Class.forname() 我們可以通過類的類類型創建該類的對象實例 通過出 c1 c2 c3創建Foo的勢力對象 Foo foo=(Foo)c1.newInstance() 需要無參數的構造方法查看全部
-
獲取信息查看全部
-
獲取類信息查看全部
-
只要在類里面聲明的都有類類型 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(")"); } } }查看全部
-
new 創建的對象,是靜態加載類,在編譯時刻就需要加載所有有可能使用到的類。 通過動態加載類可解決該問題。不會出現編譯錯誤,只可能發生運行時錯誤。 動態加載類,在運行時加載。動態加載類可實現接口,繼承接口特性,這樣方便維護,實現更新補丁等功能。查看全部
-
反射的升華操作 泛型 通過class,method了解泛型的本質 編譯之后集合的泛型是去泛型化的 java中集合的泛型,是防止錯誤輸入的,只在編譯階段有效,繞過編譯無效 驗證:通過方法的反射來操作,繞過編譯 method m = c1.getmethod("方法名",object.class); m.invoke(list1,100); //繞過編譯操作,繞過了泛型 system.out.println(list1.size());查看全部
-
一、如何獲取某個方法:方法的【名稱】和【方法的參數列表】才能【唯一確定】某個方法 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.lang.reflact.field field類封裝了關于成員變量的操作 getfield()方法獲取所有的public的成員變量信息 field[] fs = c.getfield(); field[] fs = c.getdeclarefield(); classutil.printfieldmessage();獲取打印信息 printconmessage(object obj) //打印對象的構造函數的信息 class c = obj.getclass(); 構造函數也是對象 java.lang.constructor中封裝了構造函數的信息 getconstructors獲取所有的public的構造函數 getdeclaredconstructors得到所有的構造函數 class[] paramtypes = constructor.getpatametertypes()查看全部
-
Class c1=int.class;//int 的類類型 Class c2=String.class;//String類的類類型 String類字節碼(非官方) Class c3=double.class; Class c4=Double.class; Class c5=void.class; 4)基本的數據類型 void關鍵字 都存在類類型 5)Class類的基本類型 public class ClassUtil{ //打印類的信息,包括類的成員函數、成員變量 //obj 該對象所屬類的信息 public static void printClassMessage(Objet 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.lenght;i++){ //得到方法的返回值類型的類類型 Class returnType=ms[i].getRetrunType(); System.out.println(returnType.getName()+"");//返回值類型的名字 //得到方法的名稱 System.out.print(ms[i].getName()+"("); //獲取參數類型得到的是參數列表的類型的類類型 Class[]paramTypes=ms[i].getParameterTypes(); for(Class class1:param Types){ System.out.print(class1.getName()+","); } System.out.println(")"); Method[]ms=c.getMethods();查看全部
-
2-1動態加載類 1.Clss.forName("類的全稱") 不僅表示了類的類類型,還代表了動態加載類 請大家區分編譯、運行 編譯時刻加載類是靜態加載類,運行時刻加載類是動態加載類 2.//new 創建對象是靜態加載類,在編譯時刻就需要加載所有的可能使用到的類。eg word excel //通過動態加載類可以解決該問題 //動態加載類,在運行時刻加載 Class c=Class.forName(args[0]); //通過類類型,創建該類對象 OfficeAble oa=(OfficeAble)c.newInstance();//word 和excel都想加載就用一個標準oa oa.start(); //編寫一個標準接口 interface OfficeAble { public void start(); } //讓word 和excel繼承oa class Excel implements OfficeAble { public void start(){ } }查看全部
-
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();//需要有無參數的構造方法查看全部
-
反射的操作都是編譯之后的操作 java中集合的反省,是防止錯誤輸入的,只在編譯階段有效,繞過編譯就無效了 驗證:我們可以通過方法的反射來操作,繞過編譯查看全部
-
獲得一個類的信息,要獲得一個類的類類型查看全部
-
Class c1=int.class;//int 的類類型 Class c2=String.class;//String類的類類型 String類字節碼 Class c3=double.class; Class c4=Double.class; Class c5=void.class; 4)基本的數據類型 void關鍵字 都存在類類型 5)Class類的基本類型 public class ClassUtil{ //打印類的信息,包括類的成員函數、成員變量 //obj 該對象所屬類的信息 public static void printClassMessage(Objet 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.lenght;i++){ //得到方法的返回值類型 Class returnType=ms[i].getRetrunType(); System.out.println(returnType.getName()+"");返回值類型的名字 //得到方法的名稱 System.out.print(ms[i].getName()+"("); //獲取參數類型得到的是參數列表的類型的類類型 Class[]paramTypes=ms[i].getParameterTypes(); for(Class class1:param Types){ System.out.print(class1.getName()+","); } System.out.println(")"); Method[]ms=c.getMethods();查看全部
-
2-1動態加載類 1.Clss.forName("類的全稱") 不僅表示了類的類類型,還代表了動態加載類 請大家區分編譯、運行 編譯時刻加載類是靜態加載類,運行時刻加載類是動態加載類 2.//new 創建對象是靜態加載類,在編譯時刻就需要加載所有的可能使用到的類。eg word excel //通過動態加載類可以解決該問題 //動態加載類,在運行時刻加載 Class c=Class.forName(args[0]); //通過類類型,創建該類對象 OfficeAble oa=(OfficeAble)c.newInstance();//word 和excel都想加載就用一個標準oa oa.start(); //編寫一個標準接口 interface OfficeAble { public void start(); } //讓word 和excel繼承oa class Excel implements OfficeAble { public void start(){ } }查看全部
舉報
0/150
提交
取消