Posted on 2006-09-05 14:13 
泰仔在线 阅读(1370) 
评论(0)  编辑  收藏  所属分类: 
Java 相关 
			 
			
		 
		所用方法: 
1 . java.lang.Class.getMethod(String name, Class... parameterTypes) throws NoSuchMethodException, SecurityException ; 
       String name ——待反射的目标方法 
       Class... parameterTypes ——待反射的目标方法的参数类型的列表 
2 . java.lang.reflect.Method.invoke(Object obj, Object... args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException ; 
       Object obj ——待调用反射方法的宿主对象 
       Object... args ——传入待调用反射方法参数的列表 
使用说明: 
待反射类 PersonService.java (其中有两个同名方法) 
 
  /** */ /**
 /** */ /** 
 
 
 *  @author  kxx129
 *  @author  kxx129

 *  @version  1.0.0 2006-7-24
 *  @version  1.0.0 2006-7-24

 *  @since
 *  @since  

 *
 * 

 */
  */ 
 
 
 
  public   class  PersonService
 public   class  PersonService   {
 {

 
       


 public  String PersonTest(Person person)
        public  String PersonTest(Person person)   {
 {

 person.setName(person.getName()  +   " has been detected! " );
              person.setName(person.getName()  +   " has been detected! " );

 return  person.getName()  +  person.getRole();
               return  person.getName()  +  person.getRole();

 }
       } 
 
 
 
       


 public  String PersonTest(Person person, Person person2)
        public  String PersonTest(Person person, Person person2)   {
 {

 person.setName(person.getName()  +   " has been detected! " );
              person.setName(person.getName()  +   " has been detected! " );

 return  person.getName()  +  person2.getName();
               return  person.getName()  +  person2.getName();

 }
       } 
 
 
 
 

 }
} 调用实例
》》调用目标为了调用 obj 对象的 methodName 方法,这两个值一般作为参数传入 
 Object obj  =   new  PersonService();
 Object obj  =   new  PersonService();


 String methodName = " PersonTest " ; /**/ /* 一般反射时这个obj和methodName是不知道的,这里这样直接声名纯粹为了简化,方便实现 */
String methodName = " PersonTest " ; /**/ /* 一般反射时这个obj和methodName是不知道的,这里这样直接声名纯粹为了简化,方便实现 */ 
 
 
 java.lang.reflect.Method m;
java.lang.reflect.Method m;


 Class[] cls  =
Class[] cls  =    {Person. class , Person. class } ;
 {Person. class , Person. class } ;


 Object[] arg  =
Object[] arg  =    {person2, person } ;
 {person2, person } ;


 try
 try    {
 {

 m  =  obj.getClass().getMethod(methodName, cls);
                     m  =  obj.getClass().getMethod(methodName, cls);


 /**/ /*                   System.out.println(m.getName());
 /**/ /*                   System.out.println(m.getName());

 System.out.println(m.getReturnType().getName().toUpperCase());
                     System.out.println(m.getReturnType().getName().toUpperCase());

 for (int i = 0; i<m.getGenericParameterTypes().length; i++){
                     for (int i = 0; i<m.getGenericParameterTypes().length; i++){

 System.out.println(m.getGenericParameterTypes()[i].toString());
                            System.out.println(m.getGenericParameterTypes()[i].toString());

 } */
                     } */ 
 
 
 System.out.println(String.valueOf(m.invoke(obj, arg)));
                     System.out.println(String.valueOf(m.invoke(obj, arg)));


 }   catch  (SecurityException e)
              }   catch  (SecurityException e)   {
 {

 //  TODO Auto-generated catch block
                      //  TODO Auto-generated catch block 
 
 
 e.printStackTrace();
                     e.printStackTrace();


 }   catch  (NoSuchMethodException e)
              }   catch  (NoSuchMethodException e)   {
 {

 //  TODO Auto-generated catch block
                      //  TODO Auto-generated catch block 
 
 
 e.printStackTrace();
                     e.printStackTrace();


 }   catch  (IllegalArgumentException e)
              }   catch  (IllegalArgumentException e)   {
 {

 //  TODO Auto-generated catch block
                      //  TODO Auto-generated catch block 
 
 
 e.printStackTrace();
                     e.printStackTrace();


 }   catch  (IllegalAccessException e)
              }   catch  (IllegalAccessException e)   {
 {

 //  TODO Auto-generated catch block
                      //  TODO Auto-generated catch block 
 
 
 e.printStackTrace();
                     e.printStackTrace();


 }   catch  (InvocationTargetException e)
              }   catch  (InvocationTargetException e)   {
 {

 //  TODO Auto-generated catch block
                      //  TODO Auto-generated catch block 
 
 
 e.printStackTrace();
                     e.printStackTrace();

 }
              } 代码说明:
在实例中待调用方法的参数类型列表,参数列表如下 
Class[] cls = {Person.class, Person.class}; 
Object[] arg = {person2, person }; 
所以是调用的 PersonService 类的 public String PersonTest(Person person, Person person2) 方法,如果这里换成 
Class[] cls = {Person.class }; 
Object[] arg = { person }; 
则会调用 public String PersonTest(Person person) 方法。 
当然如果参数类型列表换成 Class[] cls = {String.class }; 
则必然在 getMethod(methodName, cls) 处抛出 NoSuchMethodException 
如果参数类型与参数不对应: 
Class[] cls = {Person.class }; 
Object[] arg = { “ String ” }; 
则也必然在 invoke(obj, arg) 处抛出 IllegalArgumentException