快速业务通道

Java编程的动态性,第2部分: 引入反射 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-17
; 和 "b" 的 TwoString 类的一个实例:

清单2:构造函数的反射调用

Class[] types = new Class[] { String.class, String.class };    Constructor cons = TwoString.class.getConstructor(types);    Object[] args = new Object[] { "a", "b" };    TwoString ts = cons.newInstance(args);

清单2中的代码忽略了不同反射方法抛出的多种可能选中的例外类型。例外在 Javadoc API 描述中详细记录,因此为了简明起见,我将在所有程序实例中忽略它们。

尽管我在讨论构造函数主题,Java编程语言还定义了一种您可以用来使用 无参数(或缺 省)构造函数创建类的一个实例的特殊快捷方式。这种快捷方式嵌入到 Class 定义中,如下 :

Object newInstance() -- 使用缺省函数创建新的实例

即使这种方法只允许您使用一种特殊的构造函数,如果这正是您需要的,那么它将提供一 种非常方便的快捷方式。当与JavaBeans协作时这项技术尤其有用,JavaBeans需要定义公共 、无参数构造函数。

通过反射增加字段

获得字段信息的 Class 反射调用不同于那些用于接入构造函数的调用,在参数类型数组 中使用了字段名:

Field getField(String name) -- 获得命名的公共字段

Field[] getFields() -- 获得类的所有公共字段

Field getDeclaredField(String name) -- 获得类声明的命名的字段

Field[] getDeclaredFields() -- 获得类声明的所有字段

尽管与构造函数调用类似,在字段方面仍存在一个重要的区别:前两个变量返回可以通过 类接入的公共字段的信息 -- 即使它们来自于祖先类。后两个变量返回类直接声明的字段的 信息 -- 与字段的接入类型无关。

调用返回的 java.lang.reflect.Field 实例定义所有主类型的 getXXX 和 setXXX 方法 ,以及与对象引用协作的通用 get 和 set 方法。您可以根据实际的字段类型自行选择一种 适当的方法,而 getXXX 方法将自动处理扩展转换(如使用 getInt 方法来检索一个字节值) 。

清单3显示使用字段反射方法的一个实例,以方法的格式根据名称增加对象的 int 字段 :

清单3:通过反射增加一个字段

public int incrementField(String name, Object obj) throws...  {    Field field = obj.getClass().getDeclaredField(name);    int value = field.getInt(obj) + 1;    field.setInt(obj, value);    return value; }

这种方法开始展示了反射带来的某些灵活性。与特定的类协作不同, incrementField 使 用传 入的对象的 getClass 方法来查找类信息,然后直接在该类中查找命名的字段。

Java编程的动态性,第2部分: 引入反射(3)

时间:2011-04-09 IBM Dennis M. Sosnoski

通过反射增加方法

获得方法信息的 Class 反射调用与用于构造函数和字段的调用非常类似:

Method getMethod(String name, Class[] params) -- 使用特定的参数类型,获得命名 的公共方法

Method[] getMethods() -- 获得类的所有公共方法

Method getDeclaredMethod(String name, Class[] params) -- 使用特写的参数类型, 获得类声明的命名的方法

Method[] getDeclaredMethods() -- 获得类声明的所有方法

与字段调用一样,前两个变量返回可以通过类接入的公共方法的信息 -- 即使它们来自于 祖先类。后两个变量返回类声明的方法的信息,与方法的接入类型无关。

调用返回的 java.lang.reflect.Method 实例定义一种 invoke 方法,您可以用来在正在 定义的类的一个实例上调用方法。这种 invoke 方法使用两个参数,为调用提供类实例和参 数值数组。

清单4进一步阐述字段实例,显示反射正在运行的方法的一个实例。这种方法增加一个定 义有 get 和 set 方法的 int Ja

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号