-
2017/03/20 方法的反射—2 class A{ public void print(){ System.out.println("helloworld"); } public void print(int a,int b){ System.out.println(a+b); } public void print(String a,String b){ System.out.println(a.toUpperCase()+","+b.toLowerCase()); } }查看全部
-
2017/03/20 方法的反射—1 1)如何獲取某個方法:名稱和參數列表才能唯一決定某個方法 2)方法反射的操作:method.invoke(對象,參數列表) //要獲取print(int ,int )方法 1.要獲取一個方法就是獲取類的信息,獲取類的信息首先要獲取類的類類型 A a1 = new A(); Class c = a1.getClass(); /* 2.獲取方法 名稱和參數列表來決定 * getMethod獲取的是public的方法 * getDelcaredMethod自己聲明的方法*/ try { //Method m = c.getMethod("print", new Class[]{int.class,int.class}); Method m = c.getMethod("print", int.class,int.class); //方法的反射操作 //a1.print(10, 20);方法的反射操作是用m對象來進行方法調用 和a1.print調用的效果完全相同 //方法如果沒有返回值返回null,有返回值返回具體的返回值 //Object o = m.invoke(a1,new Object[]{10,20}); Object o = m.invoke(a1, 10,20); System.out.println("="); //獲取方法print(String,String) Method m1 = c.getMethod("print",String.class,String.class); //用方法進行反射操作 //a1.print("hello", "WORLD"); o = m1.invoke(a1, "hello","WORLD"); System.out.println("==="); //Method m2 = c.getMethod("print", new Class[]{}); Method m2 = c.getMethod("print"); //m2.invoke(a1, new Object[]{}); m2.invoke(a1); } catch (Exception e)查看全部
-
編譯時刻加載時靜態加載類,運行時刻加載時動態類查看全部
-
class類的使用 方法的反射 成員變量的反射 構造函數的反射 Java類加載機制查看全部
-
Class c1=Foo.class; Class c2=foo1.getClass();查看全部
-
Class c1=Foo.class查看全部
-
反射操作是繞過編譯(即運行時執行)時執行查看全部
-
java集合泛型是為了防止輸入錯誤,只在編譯階段有效,其他情況無效查看全部
-
方法的反射: 1.獲取A類中的print(int,int)方法: ①要獲取一個方法就是獲取類的信息,獲取類的信息首先要獲取類的類類型 A a1=new A(); Class c= a1.getClass(); ②獲取方法 由名稱和參數列表來決定,getMethod獲取的是public方法,getDelcaredMethod獲取自己聲明的方法 Method m =c.getMethod(methodName,paramtypes);//paramtypes可以用數組的形式 表示new Class[]{int.class,int.class},也可以直接列舉類類型 2.方法的反射操作:是用m對象來進行方法調用,和a1.print(10,20)調用的方法相同 m.invoke(a1,new Object[]{10,20}) Object o=m.invoke(對象名,參數);//方法如果沒有返回值返回null,如果有返回值返回具體值,參數可用數組的方式表示,也可以直接列舉,沒有參數就不寫 public Class A{ public void print(){}; public void Print(Sting a,String b){} public void Print(int a,int b){}; } public Class B{ public static void main(String[] args){ A a1 = new A(); Class c= a1.getclass; Method getMet=c.getMethod("print",String.class,String.class);//忘了加引號 Object obj=getMet.invoke(a1,"df","df"); } }查看全部
-
動態加載class:功能性的類盡量使用動態加載(dynamic load),而不是靜態加載(static load)。 Class.forName("類的全稱"); ·a.表示類的class type,b.代表動態加載類 ·請大家分清編譯,運行 ·編譯時刻加載類是靜態加載類(new constructor) 運行時刻加載類是動態加載類 new 創建對象 是靜態加載類,在編譯時刻就需要加載所有的可能使用到的類(100個功能,一個加載不成功,程序就編譯不通過) 通過動態加載就可以解決該問題 try{ //動態加載類,在運行時刻加載 Class c =Class.forName("ClassName1") //通過class type,創建該類對象 ClassName1 cn = (ClassName1)c.newInstance(); }查看全部
-
動態加載類,一般來說功能性的類,采用動態加載類。查看全部
-
反射操作繞過編譯查看全部
-
編譯時刻靜態加載,運行時刻動態加載查看全部
-
java反射機制 1 Class類反射 1.1 Class類 1)在在面向對象的世界里,萬事皆對象 java語言中,類是對象,類是java.lang.Class類的實例對象 2)類的實例的表示方式 第一種方式 Class c1 = Obj.Class; 第二種方式 Class c2 = obj.getClass(); 第三種方式 Class c3 = new Class.forName("包名+類名");查看全部
-
每一個類是Class類的實例對象(java.lang.Class) 類也是實例對象,是java.lang.Class類的實例對象,可以用三種方式表示: 1、Class c1=類.class; 2、Class c2=類的實例對象.getClass(); 3、Class c3=null; c3=Class.forName("類所屬的包.類名"); 第三種方法需要先實例化一個變量,然后通過Class.forName("")賦值,但需try,catch處理, c1和c2、c3都代表了類的類類型,一個類只可能是Class類的一個實例對象。 我們稱類這個實例對象是這個類的類類型。 可以通過類的類類型創建該類的實例對象,該實例對象需要需無參構造方法。 例:Foo(類) foo(類的實例對象)=(Foo需強制轉換類型,一般為接口,便于轉換)c1.newInstance();查看全部
舉報
0/150
提交
取消