所用方法:
1 . java.lang.Class.getMethod(String name, Class... parameterTypes) throws NoSuchMethodException, SecurityException ;
String name ——待反射的目標(biāo)方法
Class... parameterTypes ——待反射的目標(biāo)方法的參數(shù)類型的列表
2 . java.lang.reflect.Method.invoke(Object obj, Object... args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException ;
Object obj ——待調(diào)用反射方法的宿主對(duì)象
Object... args ——傳入待調(diào)用反射方法參數(shù)的列表
使用說明:
待反射類 PersonService.java (其中有兩個(gè)同名方法)
/** */ /**
* @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();

}

}
調(diào)用實(shí)例
》》調(diào)用目標(biāo)為了調(diào)用 obj 對(duì)象的 methodName 方法,這兩個(gè)值一般作為參數(shù)傳入
Object obj = new PersonService();


String methodName = " PersonTest " ; /**/ /* 一般反射時(shí)這個(gè)obj和methodName是不知道的,這里這樣直接聲名純粹為了簡化,方便實(shí)現(xiàn) */
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();

}
代碼說明:
在實(shí)例中待調(diào)用方法的參數(shù)類型列表,參數(shù)列表如下
Class[] cls = {Person.class, Person.class};
Object[] arg = {person2, person };
所以是調(diào)用的 PersonService 類的 public String PersonTest(Person person, Person person2) 方法,如果這里換成
Class[] cls = {Person.class };
Object[] arg = { person };
則會(huì)調(diào)用 public String PersonTest(Person person) 方法。
當(dāng)然如果參數(shù)類型列表換成 Class[] cls = {String.class };
則必然在 getMethod(methodName, cls) 處拋出 NoSuchMethodException
如果參數(shù)類型與參數(shù)不對(duì)應(yīng):
Class[] cls = {Person.class };
Object[] arg = { “ String ” };
則也必然在 invoke(obj, arg) 處拋出 IllegalArgumentException