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