1. 程式人生 > >利用java反射機制對方法進行呼叫

利用java反射機制對方法進行呼叫

轉自:http://blog.csdn.net/coolcoffee168/article/details/5835143

基本步驟:首先獲取Class物件,然後用該物件獲取方法。具體的就看程式碼吧。對照本文最後的結果,會更好的理解反射機制。

 

 

將要被反射的類:

[java]  view plain copy
  1. package com.gzy.reflect;  
  2.   
  3. public
     class Reflect {  
  4.       
  5.     private String name;  
  6.     private String psw;  
  7.       
  8.     public
     void setName(String name){  
  9.         this.name=name;  
  10.     }  
  11.        
  12.     public String getName(){  
  13.         return
     name;  
  14.     }  
  15.       
  16.     public void setPsw(String name){  
  17.         this.psw=psw;  
  18.     }  
  19.     public String getPsw(){  
  20.         return psw;  
  21.     }  
  22. }  

 

利用java機制的類

[java]  view plain copy
  1. package com.gzy.reflect;  
  2.   
  3. import java.lang.reflect.InvocationTargetException;  
  4. import java.lang.reflect.Method;  
  5.   
  6. public class ReflectUse {  
  7.       
  8.        public boolean UseReflect(){  
  9.            boolean flag=false;  
  10.             try {  
  11.                 //>>>>>>>>>>>>>>>>>>>>>>  
  12.                 //獲取某個類的Class物件有三種方式(其實就是獲取類Reflect),如下:  
  13.                 //方法一:利用Class.forName(String param);  
  14.                 Class cls=Class.forName("com.gzy.reflect.Reflect");  
  15.                 //方法二:使用  類名.class  
  16.                 //Class cls=Reflect.class;  
  17.                 //方法三:使用getClass()  
  18.                 //Reflect r=new Reflect();   
  19.                 //Class cls=r.getClass();  
  20.                 //<<<<<<<<<<<<<<<<<<<<<<<<  
  21.                 System.out.println("-------------cls is "+cls+"-------------------------");  
  22.                   
  23.                 //利用獲取到的類的Class物件新建一個例項(相當於Reflect new了個物件)  
  24.                 Object obj=cls.newInstance();  
  25.                   
  26.                 System.out.println("-------------obj is "+obj+"-------------------------");  
  27.                   
  28.                     Class[] param=new Class[1];  
  29.                     param[0]=String.class;  
  30.                      System.out.println("-------------param[0] is "+param[0]+"-------------------------");  
  31.                       
  32.                  //獲取Reflect的方法,第一個引數是方法名;第二個引數是引數的型別,注意是引數的型別!       
  33.                  Method med=cls.getMethod("setName",param);  
  34.                  //null表示getName方法沒有引數  
  35.                  Method med1=cls.getMethod("getName"null);  
  36.                  System.out.println("-------------med is "+med+"-------------------------");  
  37.                    
  38. //                 Object o=med.invoke(obj, new Object[]{"this is a reflect test."});  
  39.                 //開始呼叫方法,第一個引數是呼叫該方法的物件;第二個引數是值,即setName方法中要傳入的值  
  40.                  Object o=med.invoke(obj, "this is a reflect test.");  
  41.                  System.out.println("-------------o is "+o+"-------------------------");  
  42.                   
  43.                  //方法沒有 引數的話就用null表示  
  44.                  Object o1=med1.invoke(obj, null);  
  45.                  System.out.println("-------------o1 is "+o1+"-------------------------");  
  46.                   
  47.                  flag=true;  
  48.             } catch (InstantiationException e) {  
  49.                   
  50.                 e.printStackTrace();  
  51.             } catch (IllegalAccessException e) {  
  52.               
  53.                 e.printStackTrace();  
  54.             } catch (SecurityException e) {  
  55.               
  56.                 e.printStackTrace();  
  57.             } catch (NoSuchMethodException e) {  
  58.               
  59.                 e.printStackTrace();  
  60.             } catch (IllegalArgumentException e) {  
  61.               
  62.                 e.printStackTrace();  
  63.             } catch (InvocationTargetException e) {  
  64.               
  65.                 e.printStackTrace();  
  66.             } catch (ClassNotFoundException e) {  
  67.               
  68.                 e.printStackTrace();  
  69.             }  
  70.               
  71.              return flag;  
  72.        }  
  73.           
  74.               
  75.           
  76. }  

 

測試類:

 

[java]  view plain copy
  1. package com.gzy.test;  
  2.   
  3. import com.gzy.reflect.ReflectUse;  
  4.   
  5. public class TestReflect {  
  6.       
  7.     public static void main(String[] args){  
  8.         boolean flag=false;  
  9.         ReflectUse rlu=new ReflectUse();  
  10.         flag=rlu.UseReflect();  
  11.           
  12.         if(flag){  
  13.         System.out.println("successful!");  
  14.           
  15.        }else{  
  16.         System.out.println("fail~~~~");  
  17.        }  
  18.   
  19. }  
  20. }  

 

測試結果:

-------------cls is class com.gzy.reflect.Reflect-------------------------
-------------obj is [email protected]-------------------------
-------------param[0] is class java.lang.String-------------------------
-------------med is public void com.gzy.reflect.Reflect.setName(java.lang.String)-------------------------
-------------o is null-------------------------
-------------o1 is this is a reflect test.-------------------------
successful!