Method类提供了关于类或接口上单独某个方法(以及如何访问该方法)的信息。Method对象所反映的方法可能是类方法或实例方法(包括抽象方法)。利用Class对象可以获得代表该方法结构的Method对象,有了Method对象,就可以操作方法。
【例12-4】
演示利用反射机制操作方法。
在chapter12项目src目录的cn.linaw.chapter12.demo01包下创建一个Method Test测试类,如图12-6所示。
图12-6 通过反射操作方法
(1)程序第7行通过Class类的for Name方法获取指定类的Class对象。
(2)程序第11行利用Class对象获得此类所有已声明字段的Method对象数组。
方法public Method[]get Declared Methods()throws Security Exception返回表示此类所有声明方法的Method对象的一个数组,这些对象反映此Class对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。返回数组中的元素没有排序,也没有任何特定的顺序。(www.xing528.com)
(3)程序第12~14行打印Method对象数组的每一个Method对象,调用该对象的public String toString()方法,该方法返回描述此Method的字符串。该字符串被格式化为方法访问修饰符(如果有),后面依次跟着方法返回类型、空格、声明方法的类、句点、方法名、括号以及由逗号分隔的方法的形参类型列表。如果方法抛出检查异常,则参数列表后跟着空格、单词throws以及由逗号分隔的抛出异常类型的列表。
(4)程序第17行利用Class对象的new Instance()方法创建此Class对象所表示的类的一个新实例。如同用一个带有一个空参数列表的new表达式实例化该类。
(5)程序第19行利用Class对象的getDeclared Method方法指定方法名和参数,获得单个方法的Method对象。
方法public Method get Declared Method(String name,Class<?>...parameter Types)throws NoSuch Method Exception,Security Exception返回一个该类与指定方法名和参数相匹配的方法的Method对象,该对象反映此Class对象所表示的类或接口的指定已声明方法。参数name是方法名,参数parameter Types是Class对象的一个数组,它按声明顺序标识该方法的形参类型。
(6)程序第20行调用了Method对象的invoke方法。
方法public Object invoke(Object obj,Object...args)throws IllegalAccessException,Illegal ArgumentException,Invocation TargetException对带有指定参数的指定对象调用由此Method对象表示的底层方法。参数obj表示从中调用底层方法的对象;参数args用于方法调用的参数,如果形参是基本数据类型,则实参对象会自动拆箱,以便与基本数据类型形参相匹配。如果底层方法是静态的,那么可以忽略指定的obj参数。参数args可以为null,表示底层方法没有形参。
本例中,将具体方法名写在了代码中,没有体现动态性。属性的setter方法名称是有规律的,可以动态拼接而成,具体参考项目11例11-5中My ResultSetConvert工具类提供的toBean List方法。另外,要调用的方法名也可以通过配置文件配置,以体现方法调用的动态性。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。