Java编程的动态性,第2部分: 引入反射 - 编程入门网
某些时候,围绕这些限制有一种简单的方法。我在前面实例中使用的 Constructor 、 Field 和 Method 类都扩展了一个普通的基本类--  java.lang.reflect.AccessibleObject 类。该类定义一种 setAccessible 方法,使您能够 启动或关闭对这些类中其中一个类的实例的接入检测。唯一的问题在于如果使用了安全性管 理器,它将检测正在关闭接入检测的代码是否许可了这样做。如果未许可,安全性管理器抛 出一个例外。
清单6展示了一个程序,在 清单 1 TwoString 类的一个实例上使用反射来显示安全性正 在运行: 清单 6:反射安全性正在运行
如果您编译了这一程序,不使用任何特定参数直接从命令行运行,它将在 field.get (inst) 调用中抛出一个 IllegalAccessException 。如果您未注释 field.setAccessible (true) 代码行,那么重新编译并重新运行该代码,它将取得成功。最后,如果您在命令行添 加了JVM参数 -Djava.security.manager 以实现安全性管理器,它将再次失败,除非您定义 了 ReflectSecurity 类的许可权限。 反射性能 反射是一种强大的工具,但也存在一些不足。一个主要的缺点是对性能有影响。使用反射 基本上是一种解释操作,您可以告诉JVM您希望做什么并且它满足您的要求。这类操作总是慢 于只直接执行相同的操作。为了阐述使用反射的性能成本,我为本文准备了一组基准程序。 清单7是字段接入性能测试的一个摘用,包括基本的测试方法。每种方法测试字段接入的 一种形式 -- accessSame 与同一对象的成员字段协作, accessOther 使用可直接接入的另 一对象的字段, accessReflection 使用可通过反射接入的另一对象的字段。在每种情况下 ,方法执行相同的计算 -- 循环中简单的加/乘顺序。 清单 7:字段接入性能测试代码
|
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |