日期:2014-05-20  浏览次数:20821 次

问问大家一个关于反射的问题!!!
我有一个对象,通过对象的.getClass()可以知道它的类型。 
(第一个):那么我又怎么知道它有哪些方法(方法名)? 
(第二个);假设我知道它的一个方法,比如getId(),它们我又如何调用这个方法? 
  ((对象.getClass())对象).方法名,这种写法不成,对象.getClass(),方法名都是调用方法返回而来的字符串。 
大家帮帮忙,怎样才能行得通? 


------解决方案--------------------
既然都到这一步了就可以直接通过getMethods来获得所有的方法(获得一个Method数组对象),对于特定方法的调用可以用该Method对象的invoke来执行该方法
 Class clazz = obj.getClass();
 Method[] ms = class.getMethod(……)
 ms[0].invoke(……)
------解决方案--------------------
得到Class对象,调用该对象的getDeclaredMethod方法,根据方法名获得表示方法的Method对象.用法如下:
getDeclaredMethod
public Method getDeclaredMethod(String name,
Class<?>... parameterTypes)
throws NoSuchMethodException,
SecurityException返回一个 Method 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明方法。name 参数是一个 String,它指定所需方法的简称,parameterTypes 参数是 Class 对象的一个数组,它按声明顺序标识该方法的形参类型。如果在某个类中声明了带有相同参数类型的多个方法,并且其中有一个方法的返回类型比其他方法的返回类型都特殊,则返回该方法;否则将从中任选一个方法。如果名称是 "<init>” 或 “<clinit>",则引发一个 NoSuchMethodException。 

参数:
name - 方法名
parameterTypes - 参数数组 
返回:
该类与指定名和参数相匹配的方法的 Method 对象 

调用该Method对象的invoke方法,就是执行该对象所代表的具体方法.用法:
invoke
public Object invoke(Object obj,
Object... args)
throws IllegalAccessException,
IllegalArgumentException,
InvocationTargetException对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。个别参数被自动解包,以便与基本形参相匹配,基本参数和引用参数都随需服从方法调用转换。 
如果底层方法是静态的,那么可以忽略指定的 obj 参数。该参数可以为 null。 

如果底层方法所需的形参数为 0,则所提供的 args 数组长度可以为 0 或 null。 

如果底层方法是实例方法,则使用动态方法查找来调用它,这一点记录在 Java Language Specification, Second Edition 的第 15.12.4.4 节中;在发生基于目标对象的运行时类型的重写时更应该这样做。 

如果底层方法是静态的,并且尚未初始化声明此方法的类,则会将其初始化。 

如果方法正常完成,则将该方法返回的值返回给调用者;如果该值为基本类型,则首先适当地将其包装在对象中。但是,如果该值的类型为一组基本类型,则数组元素不 被包装在对象中;换句话说,将返回基本类型的数组。如果底层方法返回类型为 void,则该调用返回 null。 


参数:
obj - 从中调用底层方法的对象
args - 用于方法调用的参数 
返回:
使用参数 args 在 obj 上指派该对象所表示方法的结果 


------解决方案--------------------
这是非常初级的问题,请访问www.google.com or www.baidu.com 键入“java reflection”