泰仔在线

java学习,心情日记,缤纷时刻
posts - 100, comments - 34, trackbacks - 0, articles - 0

Java中反射的使用

Posted on 2006-09-05 14:13 泰仔在线 阅读(1351) 评论(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

 * 
@version  1.0.0 2006-7-24

 * 
@since  

 * 

 
*/


public   class  PersonService  {

       

       
public  String PersonTest(Person person)  {

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

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

       }


       

       
public  String PersonTest(Person person, Person person2)  {

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

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

       }


 

}

调用实例

》》调用目标为了调用 obj 对象的 methodName 方法,这两个值一般作为参数传入

Object obj  =   new  PersonService();

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

java.lang.reflect.Method m;

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

Object[] arg 
=   {person2, person } ;

try   {

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

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

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

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

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

                     }
*/


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

              }
  catch  (SecurityException e)  {

                     
//  TODO Auto-generated catch block

                     e.printStackTrace();

              }
  catch  (NoSuchMethodException e)  {

                     
//  TODO Auto-generated catch block

                     e.printStackTrace();

              }
  catch  (IllegalArgumentException e)  {

                     
//  TODO Auto-generated catch block

                     e.printStackTrace();

              }
  catch  (IllegalAccessException e)  {

                     
//  TODO Auto-generated catch block

                     e.printStackTrace();

              }
  catch  (InvocationTargetException e)  {

                     
//  TODO Auto-generated catch block

                     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


只有注册用户登录后才能发表评论。


网站导航: