利用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 com.gzy.reflect.Reflect@d9f9c3-------------------------
-------------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!


猜你喜欢

转载自blog.csdn.net/qi15211/article/details/45741761