快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-17
vaBean属性。例如,如果对象为一个整数 count 值定义了 getCount 和 setCount 方法,您可以在一次调用中向该方法传递“count”作为 name 参数 ,以增加该值。

清单4:通过反射增加一个JavaBean 属性

public int incrementProperty(String name, Object obj) {    String prop = Character.toUpperCase(name.charAt(0)) +      name.substring(1);    String mname = "get" + prop;    Class[] types = new Class[] {};    Method method = obj.getClass().getMethod(mname, types);    Object result = method.invoke(obj, new Object[0]);    int value = ((Integer)result).intValue() + 1;    mname = "set" + prop;    types = new Class[] { int.class };    method = obj.getClass().getMethod(mname, types);    method.invoke(obj, new Object[] { new Integer(value) });    return value; }

为了遵循JavaBeans惯例,我把属性名的首字母改为大写,然后预先考虑 get 来创建读方 法名, set 来创建写方法名。JavaBeans读方法仅返回值,而写方法使用值作为唯一的参数 ,因此我规定方法的参数类型以进行匹配。最后,该惯例要求方法为公共,因此我使用查找 格式,查找类上可调用的公共方法。

这一实例是第一个我使用反射传递主值的实例,因此现在我们来看看它是如何工作的。基 本原理很简单:无论什么时候您需要传递主值,只需用相应封装类的一个实例(在 java.lang 包中定义)来替换该类主值。这可以应用于调用和返回。因此,当我在实例中调 用 get 方法时,我预计结果为实际 int 属性值的 java.lang.Integer 封装。

反射数组

数组是Java编程语言中的对象。与所有对象一样,它们都有类。如果您有一个数组,使用 标准 getClass 方法,您可以获得该数组的类,就象任何其它对象一样。但是, 不通过现有 的实例来获得类不同于其它类型的对象。即使您有一个数组类,您也不能直接对它进行太多 的操作 -- 反射为标准类提供的构造函数接入不能用于数组,而且数组没有任何可接入的字 段,只有基本的 java.lang.Object 方法定义用于数组对象。

数组的特殊处理使用 java.lang.reflect.Array 类提供的静态方法的集合。该类中的方 法使您能够创建新数组,获得数组对象的长度,读和写数组对象的索引值。

清单5显示了一种重新调整现有数组大小的有效方法。它使用反射来创建相同类型的新数 组,然后在返回新数组之前,在老数组中复制所有数据。

清单 5:通过反射来扩展一个数组

public Object growArray(Object array, int size) {    Class type = array.getClass().getComponentType();    Object grown = Array.newInstance(type, size);    System.arraycopy(array, 0, grown, 0,       Math.min(Array.getLength(array), size));    return grown; }

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

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

安全性和反射

在处理反射时安全性是一个较复杂的问题。反射经常由框架型代码使用,由于这一点,您 可能希望框架能够全面接入您的代码,无需考虑常规的接入限制。但是,在其它情况下,不 受控制的接入会带来严重的安全性风险,如当代码在不值得信任的代码共享的环境中运行时 。

由于这些互相矛盾的需求,Java编程语言定义一种多级别方法来处理反射的安全性。基本 模式是对反射实施与应用于源代码接入相同的的限制:

从任意位置到类公共组件的接入

类自身外部无任何到私有组件的接入

受保护和打包(缺省接入)组件的有限接入

不过-至少

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号