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