⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 java编程 的动态性,第 2部分:引入反射.htm

📁 javn的Java书籍JAVA集合框架.rar我看过了是很有帮助的
💻 HTM
📖 第 1 页 / 共 4 页
字号:
        return timing.m_value;
    } catch (Exception ex) {
        System.out.println("Error using reflection");
        throw ex;
    }
}
</CODE></PRE></TD></TR></TBODY></TABLE>
      <P>测试程序重复调用每种方法,使用一个大循环数,从而平均多次调用的时间衡量结果。平均值中不包括每种方法第一次调用的时间,因此初始化时间不是结果中的一个因素。在为本文进行的测试中, 
      每次调用时我使用1000万的循环数,在1GHz PIIIm系统上运行。三个不同Linux 
      JVM的计时结果如图1所示。所有测试使用每个JVM的缺省设置。</P>
      <P><A name=IDAT1MQD><B>图 1:字段接入时间 </B></A><BR><IMG 
      alt="Field access times" height=238 
      src="Java编程 的动态性,第 2部分:引入反射.files/field-accesses.jpg" width=538></P>
      <P>上表的对数尺度可以显示所有时间,但减少了差异看得见的影响。在前两副图中(Sun 
      JVM),使用反射的执行时间超过使用直接接入的1000倍以上。通过比较,IBM 
      JVM可能稍好一些,但反射方法仍旧需要比其它方法长700倍以上的时间。任何JVM上其它两种方法之间时间方面无任何显著差异,但IBM 
      JVM几乎比Sun JVM快一倍。最有可能的是这种差异反映了Sun Hot Spot JVM的专业优化,它在简单基准方面表现得很糟糕。</P>
      <P>除了字段接入时间测试之外,我还进行了相同的方法调用时间测试。在方法调用中,我试用了与字段接入相同的三种接入变量,并增加了使用无参数方法变量,而不是在方法调用中传递和返回一个值。清单8显示了用于测试调用传递和返回值形式的三种方法的代码。</P><A 
      name=IDAB2MQD><B>清单 8:方法接入性能测试代码</B></A><BR>
      <TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 
        width="100%"><TBODY>
        <TR>
          <TD><PRE><CODE>
public int callDirectArgs(int loops) {
    int value = 0;
    for (int index = 0; index &lt; loops; index++) {
        value = step(value);
    }
    return value;
}

public int callReferenceArgs(int loops) {
    TimingClass timing = new TimingClass();
    int value = 0;
    for (int index = 0; index &lt; loops; index++) {
        value = timing.step(value);
    }
    return value;
}

public int callReflectArgs(int loops) throws Exception {
    TimingClass timing = new TimingClass();
    try {
        Method method = TimingClass.class.getMethod
            ("step", new Class [] { int.class });
        Object[] args = new Object[1];
        Object value = new Integer(0);
        for (int index = 0; index &lt; loops; index++) {
            args[0] = value;
            value = method.invoke(timing, args);
        }
        return ((Integer)value).intValue();
    } catch (Exception ex) {
        System.out.println("Error using reflection");
        throw ex;
    }
}
</CODE></PRE></TD></TR></TBODY></TABLE>
      <P>图 2显示了我从方法调用中获得的计时结果。反射远慢于直接接入。差异不象字段接入那么大,但是,在不使用参数的情况下,范围从Sun 1.3.1 
      JVM的数百倍到IBM 
      JVM的不到30倍。在所有JVM上,使用参数的反射方法调用的测试性能慢于不使用参数的调用。由于传递和返回<CODE>int</CODE>值需要的<CODE>java.lang.Integer</CODE>封装,这可能是局部的。由于<CODE>Integer</CODE>s是不可变的,每种方法返回提出了一种新的需求,它将增加大量的开销。</P>
      <P><A name=IDA02MQD><B>图 2:方法调用时间</B></A><BR><IMG alt="Method call times" 
      height=372 src="Java编程 的动态性,第 2部分:引入反射.files/method-calls.jpg" 
      width=561></P>
      <P>反射性能是Sun开发1.4 JVM时关注的一个方面,它在反射方法调用结果中显示。在这类操作的性能方面,Sun 1.4.1 
      JVM显示了比1.3.1版本很大的改进,在我的测试中运行速度大约是1.3.1版本的开部。在这类简单的测试中,IBM 1.4.0 
      JVM再次获得了更好的成绩,但是只比Sun 1.4.1 JVM快两到三倍。</P>
      <P>我还为创建使用反射的对象编写了类似的计时测试程序,但这种情况下的差异不象字段和方法调用情况下那么显著。使用<CODE>newInstance()</CODE>调用创建一个简单的<CODE>java.lang.Object</CODE>实例耗用的时间大约是在Sun 
      1.3.1 JVM上使用<CODE>new Object()</CODE>的12倍,是在IBM 1.4.0 JVM的四倍,只是Sun 1.4.1 
      JVM上的两部。使用<CODE>Array.newInstance(type, 
      size)</CODE>创建一个数组耗用的时间是任何测试的JVM上使用<CODE>new 
      type[size]</CODE>的两倍,随着数组大小的增加,差异逐步缩小。</P>
      <P><A name=IDA33MQD><SPAN 
      class=atitle2>结束语</SPAN></A><BR>Java语言反射提供一种动态链接程序组件的多功能方法。它允许程序创建和控制任何类的对象(根据安全性限制),无需提前硬编码目标类。这些特性使得反射特别适用于创建以非常普通的方式与对象协作的库。例如,反射经常在持续存储对象为数据库、XML或其它外部格式的框架中使用。</P>
      <P>反射有两个缺点。第一个是性能问题。当用于字段和方法接入时反射要远慢于直接代码。性能问题的程度取决于程序中是如何使用反射的。如果它作为程序运行中相对很少涉及的部分,缓慢的性能将不会是一个问题。即使测试中最坏情况下的计时图显示的反射操作只耗用几微秒。仅反射在性能关键的应用的核心逻辑中使用时性能问题才变得至关重要。</P>
      <P>许多应用更严重的一个缺点是使用反射会模糊程序内部实际要发生的事情。程序人员希望在源代码中看到程序的逻辑,反射等绕过了源代码的技术会带来维护问题。反射代码比相应的直接代码更复杂,正如性能比较的代码实例中看到的一样。解决这些问题的最佳方案是保守地使用反射-- 
      仅在它可以真正增加灵活性的地方 -- 记录其在目标类中的使用。</P>
      <P>在下一部分,我将提供如何使用反射的更详细实例。这种实例提供一个处理Java应用命令行参数的API,一种您可能发现适用于自己应用的工具。它还基于反射的优势来创建,同时避免其弱点。反射是否能简化您的命令行处理?您可以在<I>Java编程的动态性</I>第3部分找到答案。</P><!-- RESOURCES-->
      <P><A name=resources><SPAN class=atitle2>参考资料</SPAN></A> 
      <UL><!-- Comment out list item below if there is no forum for this article-->
        <LI>下载本文中使用的<A 
        href="ftp://www6.software.ibm.com/software/developer/library/j-dyn0603.zip">performance 
        benchmarks programs</A>。<BR><BR>
        <LI>阅读“<A 
        href="http://www-106.ibm.com/developerworks/java/library/j-reflection.html">Reflection: 
        A new way to discover information about Java classes</A>” 
        (<I>developerWorks</I>, 1998年5月),了解过去关于Java反射的增长功能的看法。<BR><BR>
        <LI>反射在与JavaBeans组件协作中扮演了一个极其重要的角色。阅读“<A 
        href="http://www-106.ibm.com/developerworks/java/library/j-introspect/">Reflecting, 
        introspecting, and customizing JavaBeans</A>”(<I>developerWorks</I>, 
        2000年2月)了解所有相关信息。<BR><BR>
        <LI>反射的大范围使用会影响框架的性能。关于图形实例及一些相关讨论,请参阅作者的XML数据捆绑文章“<A 
        href="http://www-900.ibm.com/developerWorks/cn/xml/x-databdopt/part2/index.shtml">\数据帮定, 
        第二部分: 性能</A>”(<I>developerWorks</I>,2003年1月)和“<A 
        href="http://www-900.ibm.com/developerWorks/cn/xml/x-databd3/index.shtml">数据绑定,第 
        3 部分:JiBX 体系结构</A>”(<I>developerWorks</I>,2003年4月)。<BR><BR>
        <LI>关于使用反射的高级教程,请阅读Sun提供的Java教程中的<A 
        href="http://java.sun.com/docs/books/tutorial/reflect/index.html">The 
        Reflection API</A>。<BR><BR>
        <LI>在<A 
        href="http://www-900.ibm.com/developerWorks/cn/java/index.shtml"><I>developerWorks</I> 
        Java技术专区</A>中可以找到数百篇关于Java技术的文章。<BR><BR></LI></UL>
      <P></P><!-- AUTHOR BIOS--><!-- Make author heading singular or plural as needed-->
      <TABLE border=0 cellPadding=0 cellSpacing=0 width="100%">
        <TBODY>
        <TR>
          <TD><A name=author1><SPAN class=atitle2>关于作者</SPAN></A> <BR><IMG 
            align=left alt="Photo of Dennis Sosnoski" border=0 height=80 
            src="Java编程 的动态性,第 2部分:引入反射.files/p-sosnoski.jpg" width=64>Dennis 
            Sosnoski 是西雅图地区 Java 咨询公司 <A href="http://www.sosnoski.com/" 
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Sosnoski 
            Software Solutions, Inc.</A> 的创始人和首席顾问,他是 J2EE、XML 和 Web 
            服务支持方面的专家。他已经有 30 多年专业软件开发经验,最近几年他集中研究服务器端的 Java 技术。Dennis 
            经常在全国性的会议上就 XML 和 Java 技术发表演讲,他还是 <A 
            href="http://www.sosnoski.com/jxml" 
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Seattle 
            Java-XML SIG</A> 的主席。可以通过 <A href="mailto:dms@sosnoski.com" 
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">dms@sosnoski.com</A> 
            与 Dennis 联系。 </TD></TR></TBODY></TABLE></TD>
    <TD width=10><IMG alt="" border=0 height=1 
      src="Java编程 的动态性,第 2部分:引入反射.files/c.gif" width=10></TD></TR></TBODY></TABLE><!-- END PAPER BODY--><BR clear=all><IMG 
alt="" border=0 height=10 src="Java编程 的动态性,第 2部分:引入反射.files/c.gif" 
width=100><BR>
<TABLE border=0 cellPadding=0 cellSpacing=0 width="100%">
  <TBODY>
  <TR>
    <TD align=right width="100%"><A 
      href="http://www-900.ibm.com/developerWorks/cn/java/j-dyn0603/#top">到页首</A></TD>
    <TD width=5><IMG alt="" border=0 height=1 
      src="Java编程 的动态性,第 2部分:引入反射.files/c.gif" width=5></TD></TR>
  <TR vAlign=top>
    <TD bgColor=#000000 colSpan=2><IMG alt="" border=0 height=1 
      src="Java编程 的动态性,第 2部分:引入反射.files/c.gif" width=100></TD></TR>
  <TR vAlign=top>
    <TD bgColor=#ffffff colSpan=2><IMG alt="" border=0 height=8 
      src="Java编程 的动态性,第 2部分:引入反射.files/c.gif" width=100></TD></TR></TBODY></TABLE>
<TABLE border=0 cellPadding=10 cellSpacing=0 width="100%">
  <TBODY>
  <TR vAlign=top>
    <TD>
      <FORM action=/developerWorks/cn/cnratings.nsf/RateArticle?CreateDocument 
      method=post name=getURL><INPUT name=ArticleTitle type=hidden 
      value="Java编程 的动态性,第 2部分:引入反射"> <INPUT name=url type=hidden>
      <SCRIPT language=javascript>getURL();</SCRIPT>
       <INPUT name=Zone type=hidden value=Java> <INPUT name=RedirectURL 
      type=hidden value=/developerWorks/cn/thankyou/feedback-java.html> <A 
      name=rating><B>您对这篇文章的看法如何?</B></A> 
      <TABLE border=0 cellPadding=0 cellSpacing=0 width=600>
        <TBODY>
        <TR>
          <TD colSpan=5><IMG alt="" border=0 height=8 
            src="Java编程 的动态性,第 2部分:引入反射.files/c.gif" width=100></TD></TR>
        <TR vAlign=top>
          <TD width="16%"><INPUT name=Rating type=radio value=5>真棒!(5)</TD>
          <TD width="20%"><INPUT name=Rating type=radio value=4>好材料 (4)</TD>
          <TD width="24%"><INPUT name=Rating type=radio value=3>一般;尚可 (3)</TD>
          <TD width="22%"><INPUT name=Rating type=radio value=2>需提高 (2)</TD>
          <TD width="18%"><INPUT name=Rating type=radio value=1>太差! 
        (1)</TD></TR></TBODY></TABLE><BR><B>建议?</B><BR><TEXTAREA cols=60 name=Comments rows=5 wrap=virtual></TEXTAREA><BR><BR><INPUT type=submit value=提交反馈意见></FORM></TD></TR>
  <TR vAlign=top>
    <TD bgColor=#ffffff><IMG alt="" border=0 height=8 
      src="Java编程 的动态性,第 2部分:引入反射.files/c.gif" width=100></TD></TR></TBODY></TABLE>
<TABLE border=0 cellPadding=0 cellSpacing=0 width="100%">
  <TBODY>
  <TR>
    <TD align=right>(c) Copyright IBM Corp. 2001, (c) Copyright IBM China 
      2001, All Right Reserved</TD></TR>
  <TR vAlign=top>
    <TD class=bbg height=21>&nbsp;&nbsp;<A class=mainlink 
      href="http://www-900.ibm.com/developerWorks/cn/cgi-bin/click.cgi?url=www-900.ibm.com/cn/ibm/index.shtml&amp;origin=dwhead">关于 
      IBM</A><SPAN class=divider>&nbsp;&nbsp;|&nbsp;&nbsp;</SPAN><A 
      class=mainlink 
      href="http://www-900.ibm.com/developerWorks/cn/cgi-bin/click.cgi?url=www-900.ibm.com/cn/ibm/privacy/index.shtml&amp;origin=dwhead">隐私条约</A><SPAN 
      class=divider>&nbsp;&nbsp;|&nbsp;&nbsp;</SPAN><A class=mainlink 
      href="http://www-900.ibm.com/developerWorks/cn/cgi-bin/click.cgi?url=www-900.ibm.com/cn/ibm/legal/index.shtml&amp;origin=dwhead">使用条款</A><SPAN 
      class=divider>&nbsp;&nbsp;|&nbsp;&nbsp;</SPAN><A class=mainlink 
      href="http://www-900.ibm.com/developerWorks/cn/cgi-bin/click.cgi?url=www-900.ibm.com/cn/ibm/contact/index.shtml&amp;origin=dwhead">联系 
      IBM</A></TD></TR></TBODY></TABLE>
<SCRIPT language=JavaScript1.2 src="Java编程 的动态性,第 2部分:引入反射.files/stats.js" 
type=text/javascript></SCRIPT>
<NOSCRIPT><IMG alt="" border=0 height=1 
src="D:\prePrj\ref\Java编程 的动态性,第 2部分:引入反射.files\c(1).gif" width=1></NOSCRIPT> 
</A></BODY></HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -