快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-17
某些时候,围绕这些限制有一种简单的方法。我在前面实例中使用的 Constructor 、 Field 和 Method 类都扩展了一个普通的基本类--&#160 java.lang.reflect.AccessibleObject 类。该类定义一种 setAccessible 方法,使您能够 启动或关闭对这些类中其中一个类的实例的接入检测。唯一的问题在于如果使用了安全性管 理器,它将检测正在关闭接入检测的代码是否许可了这样做。如果未许可,安全性管理器抛 出一个例外。

清单6展示了一个程序,在 清单 1 TwoString 类的一个实例上使用反射来显示安全性正 在运行:

清单 6:反射安全性正在运行

public class ReflectSecurity {    public static void main(String[] args) {      try {        TwoString ts = new TwoString("a", "b");        Field field = clas.getDeclaredField("m_s1"); //     field.setAccessible(true);        System.out.println("Retrieved value is " +          field.get(inst));      } catch (Exception ex) {        ex.printStackTrace(System.out);      }    } }

如果您编译了这一程序,不使用任何特定参数直接从命令行运行,它将在 field.get (inst) 调用中抛出一个 IllegalAccessException 。如果您未注释 field.setAccessible (true) 代码行,那么重新编译并重新运行该代码,它将取得成功。最后,如果您在命令行添 加了JVM参数 -Djava.security.manager 以实现安全性管理器,它将再次失败,除非您定义 了 ReflectSecurity 类的许可权限。

反射性能

反射是一种强大的工具,但也存在一些不足。一个主要的缺点是对性能有影响。使用反射 基本上是一种解释操作,您可以告诉JVM您希望做什么并且它满足您的要求。这类操作总是慢 于只直接执行相同的操作。为了阐述使用反射的性能成本,我为本文准备了一组基准程序。

清单7是字段接入性能测试的一个摘用,包括基本的测试方法。每种方法测试字段接入的 一种形式 -- accessSame 与同一对象的成员字段协作, accessOther 使用可直接接入的另 一对象的字段, accessReflection 使用可通过反射接入的另一对象的字段。在每种情况下 ,方法执行相同的计算 -- 循环中简单的加/乘顺序。

清单 7:字段接入性能测试代码

public int accessSame(int loops) {    m_value = 0;    for (int index = 0; index < loops; index++) {      m_value = (m_value + ADDITIVE_VALUE) *        MULTIPLIER_VALUE;    }    return m_value; } public int accessReference(int loops) {    TimingClass timing = new TimingClass();    for (int index = 0; index < loops; index++) {      timing.m_value = (timing.m_value + ADDITIVE_VALUE) *        MULTIPLIER_VALUE;    }    return timing.m_value; } public int accessReflection(int loops) throws Exception {    TimingClass timing = new TimingClass();    try {      Field field = TimingClass.class.        getDeclaredField("m_value");      for (int index = 0; index < loops; index++) {        int value = (field.getInt(timing) +          ADDITIVE_VALUE) * MULTIPLIER_VALUE;        field.setInt(timing, value);      }      return timing.m_value;    } catch (Exception ex) {      System.out.println("Er

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