📄 java编程 的动态性,第 2部分:引入反射.htm
字号:
<TR><!-- Sidebar Gutter-->
<TD width=8><IMG alt="" height=21
src="Java编程 的动态性,第 2部分:引入反射.files/c.gif" width=5></TD>
<TD width=160><!-- Start TOC-->
<TABLE border=0 cellPadding=0 cellSpacing=0 width=160>
<TBODY>
<TR>
<TD bgColor=#000000 height=1 width=160><IMG alt="" height=1
src="Java编程 的动态性,第 2部分:引入反射.files/c.gif" width=160></TD></TR>
<TR>
<TD align=middle
background="Java编程 的动态性,第 2部分:引入反射.files/bg-gold.gif"
height=5><B>内容:</B> </TD></TR>
<TR>
<TD bgColor=#666666 height=1 width=160><IMG alt="" height=1
src="Java编程 的动态性,第 2部分:引入反射.files/c.gif" width=160></TD></TR>
<TR>
<TD align=right>
<TABLE border=0 cellPadding=3 cellSpacing=0 width="98%">
<TBODY>
<TR>
<TD><A
href="http://www-900.ibm.com/developerWorks/cn/java/j-dyn0603/#IDAQCMQD">初学者的类</A></TD></TR>
<TR>
<TD><A
href="http://www-900.ibm.com/developerWorks/cn/java/j-dyn0603/#IDA3DMQD">基于类的反射</A></TD></TR>
<TR>
<TD><A
href="http://www-900.ibm.com/developerWorks/cn/java/j-dyn0603/#IDA3XMQD">安全性和反射</A></TD></TR>
<TR>
<TD><A
href="http://www-900.ibm.com/developerWorks/cn/java/j-dyn0603/#IDAM0MQD">反射性能</A></TD></TR>
<TR>
<TD><A
href="http://www-900.ibm.com/developerWorks/cn/java/j-dyn0603/#IDA33MQD">结束语</A></TD></TR>
<TR>
<TD><A
href="http://www-900.ibm.com/developerWorks/cn/java/j-dyn0603/#resources">参考资料</A></TD></TR>
<TR>
<TD><A
href="http://www-900.ibm.com/developerWorks/cn/java/j-dyn0603/#author1">关于作者</A></TD></TR>
<TR>
<TD><A
href="http://www-900.ibm.com/developerWorks/cn/java/j-dyn0603/#rating">对本文的评价</A></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><!-- End TOC--><!-- Start Related Content Area-->
<TABLE border=0 cellPadding=0 cellSpacing=0 width=160>
<TBODY>
<TR>
<TD bgColor=#000000 height=1 width=160><IMG alt="" height=1
src="Java编程 的动态性,第 2部分:引入反射.files/c.gif" width=160></TD></TR>
<TR>
<TD align=middle
background="Java编程 的动态性,第 2部分:引入反射.files/bg-gold.gif"
height=5><B>相关内容:</B> </TD></TR>
<TR>
<TD bgColor=#666666 height=1 width=160><IMG alt="" height=1
src="Java编程 的动态性,第 2部分:引入反射.files/c.gif" width=160></TD></TR>
<TR>
<TD align=right>
<TABLE border=0 cellPadding=3 cellSpacing=0 width="98%">
<TBODY>
<TR>
<TD><A
href="http://www-106.ibm.com/developerworks/java/library/j-reflection.html">反射:发现Java类信息的新方法</A></TD></TR>
<TR>
<TD><A
href="http://www-106.ibm.com/developerworks/java/library/j-introspect/">反射、反思和定制JavaBeans</A></TD></TR>
<TR>
<TD><A
href="http://www-106.ibm.com/developerworks/toolbox/">developerWorks
Toolbox订阅</A></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><!-- End TOC--><!-- Start Related Content Area-->
<TABLE border=0 cellPadding=0 cellSpacing=0 width=160>
<TBODY>
<TR>
<TD bgColor=#000000 height=1 width=160><IMG alt="" height=1
src="Java编程 的动态性,第 2部分:引入反射.files/c.gif" width=160></TD></TR>
<TR>
<TD align=middle
background="Java编程 的动态性,第 2部分:引入反射.files/bg-gold.gif"
height=5><A class=nav
href="http://www-900.ibm.com/developerWorks/cn/java/index.shtml"><B>Java
专区中还有:</B></A></TD></TR>
<TR>
<TD bgColor=#666666 height=1 width=160><IMG alt="" height=1
src="Java编程 的动态性,第 2部分:引入反射.files/c.gif" width=160></TD></TR>
<TR>
<TD align=right>
<TABLE border=0 cellPadding=3 cellSpacing=0 width="98%">
<TBODY>
<TR>
<TD><A
href="http://www-900.ibm.com/developerWorks/cn/cnedu.nsf/java-onlinecourse-bytitle?OpenView&Count=500">教学</A></TD></TR>
<TR>
<TD><A
href="http://www-900.ibm.com/developerWorks/cn/cntools.nsf/dw/java-all-byname?OpenDocument&count=500">工具与产品</A></TD></TR>
<TR>
<TD><A
href="http://www-900.ibm.com/developerWorks/cn/cntools.nsf/dw/java-beans-bytitle?OpenDocument&count=500">代码与组件</A></TD></TR>
<TR>
<TD><A
href="http://www-900.ibm.com/developerWorks/cn/cnpapers.nsf/java-papers-bynewest?OpenView&Count=500">所有文章</A></TD></TR>
<TR>
<TD><A
href="http://www-900.ibm.com/developerWorks/cn/cntips.nsf/java-tips-bydate?OpenView&Count=500">实用技巧</A></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><!-- End Related dW Content Area-->
<TABLE border=0 cellPadding=0 cellSpacing=0 width=160>
<TBODY>
<TR>
<TD bgColor=#000000 colSpan=2 height=2 width=150><IMG alt=""
height=2 src="Java编程 的动态性,第 2部分:引入反射.files/c.gif"
width=160></TD></TR>
<TR>
<TD bgColor=#ffffff colSpan=2 height=2 width=150><IMG alt=""
height=2 src="Java编程 的动态性,第 2部分:引入反射.files/c.gif"
width=160></TD></TR></TBODY></TABLE><!-- END STANDARD SIDEBAR AREA--></TD></TR></TBODY></TABLE>
<P><SPAN class=atitle2>使用运行时类信息来准备编程</SPAN> 级别:入门级</P>
<P><A
href="http://www-900.ibm.com/developerWorks/cn/java/j-dyn0603/#author1">Dennis
M. Sosnoski</A> (<A
href="mailto:dms@sosnoski.com">dms@sosnoski.com</A>)<BR>总裁, Sosnoski
Software Solutions, Inc.<BR>2003年 8 月 </P>
<BLOCKQUOTE>反射使您的程序代码能够接入装载到JVM中的类的内部信息,允许您编写与执行时,而不是源代码中选定的类协作的代码。这使反射成为构建灵活的应用的主要工具。但需注意的是
-- 如果使用不当,反射的成本很高。在Java平台系列的第2部分中,软件顾问Dennis
Sosnoski介绍了如何使用反射,以及某些相关的成本。您还将找到Java Reflection API如何使您能够在运行时关联对象。
</BLOCKQUOTE>
<P>在“<A
href="http://www-900.ibm.com/developerWorks/cn/java/j-dyn0429/">Java编程的动态性,第1部分</A>,”我为您介绍了Java编程类和类装入。该篇文章介绍了一些Java二进制类格式的相关信息。这个月我将阐述使用Java反射API来在运行时接入和使用一些相同信息的基础。为了使已经熟知反射基础的开发人员关注本文,我将在文章中包括反射性能如何与直接接入相比较。</P>
<P>使用反射不同于常规的Java编程,其中它与<I>元数据</I>--描述其它数据的数据协作。Java语言反射接入的特殊类型的原数据是JVM中类和对象的描述。反射使您能够运行时接入广泛的类信息。它甚至使您能够读写字段,调用运行时选择的类的方法。</P>
<P>反射是一种强大的工具。它使您能够创建灵活的代码,这些代码可以在运行时装配,无需在组件之间进行源代表链接。但反射的某些方面存在一些疑问。在本文中,我将深入讨论为什么您可能<I>不</I>希望在程序中使用反射,以及您应该这样做的理由。在了解了权衡性分析之后,您可以自行决定是否利大于弊。</P>
<P><A name=IDAQCMQD><SPAN
class=atitle2>初学者的类</SPAN></A><BR>使用反射的启点总是<CODE>java.lang.Class</CODE>实例。如果您希望与预先定义的类协作,那么Java语言提供一种直接获得<CODE>Class</CODE>实例的简便快捷方式:</P>
<P>
<TABLE align=right border=1 cellPadding=5 cellSpacing=0 width="30%">
<TBODY>
<TR>
<TD background="Java编程 的动态性,第 2部分:引入反射.files/bg-gold.gif">
<P><A name=IDACDMQD><B>不要错过本系列的其它文章</B></A><BR></P>第1部分,“<A
href="http://www-900.ibm.com/developerWorks/cn/java/j-dyn0429/">类和类装入</A>”
(2003年4月) </TD></TR></TBODY></TABLE></P>
<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="30%">
<TBODY>
<TR>
<TD><PRE><CODE>
Class clas = MyClass.class;
</CODE></PRE></TD></TR></TBODY></TABLE>
<P>当您使用这一项技术时,装入类涉及的所有工作在幕后进行。但是,如果您需要在运行时从某些外部源读取类名,这种方法并不适合。实际上,您需要使用一个类装入器来查找类信息。以下介绍一种方法:</P>
<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="60%">
<TBODY>
<TR>
<TD><PRE><CODE>
// "name" is the class name to load
Class clas = null;
try {
clas = Class.forName(name);
} catch (ClassNotFoundException ex) {
// handle exception case
}
// use the loaded class
</CODE></PRE></TD></TR></TBODY></TABLE>
<P>如果已经装入了类,您将得到现有的<CODE>Class</CODE>信息。如果类未被装入,类装入器将现在装入并返回新创建的类实例。</P>
<P><A name=IDA3DMQD><SPAN
class=atitle2>基于类的反射</SPAN></A><BR><CODE>Class</CODE>对象为您提供接入类元数据的反射的所有基本hook。这类元数据包括关于类自身的信息,如包和类的父类,以及该类实施的接口。它还包括该类定义的构造函数、字段和方法的详细信息。这些最后的项目都是编程中最经常使用的项目,
因此我将在本小节的稍后部分给出一些与它们协作的实例。</P>
<P>对于以下三类组件中的任何一类来说 -- 构造函数、字段和方法 -- <CODE>java.lang.Class</CODE>
提供四种独立的反射调用,以不同的方式来获得信息。调用都遵循一种标准格式。以下是用于查找构造函数的一组反射调用:</P>
<UL>
<LI><CODE>Constructor getConstructor(Class[] params)</CODE> --
获得使用特殊的参数类型的公共构造函数,<BR><BR>
<LI><CODE>Constructor[] getConstructors()</CODE> -- 获得类的所有公共构造函数<BR><BR>
<LI><CODE>Constructor getDeclaredConstructor(Class[] params)</CODE> --
获得使用特定参数类型的构造函数(与接入级别无关)<BR><BR>
<LI><CODE>Constructor[] getDeclaredConstructors()</CODE> --
获得类的所有构造函数(与接入级别无关) </LI></UL>
<P>每类这些调用都返回一个或多个<CODE>java.lang.reflect.Constructor</CODE>函数。这种<CODE>Constructor</CODE>类定义<CODE>newInstance</CODE>方法,它采用一组对象作为其唯一的参数,然后返回新创建的原始类实例。该组对象是用于构造函数调用的参数值。作为解释这一工作流程的实例,假设您有一个<CODE>TwoString</CODE>
类和一个使用一对<CODE>String</CODE>s的构造函数,如清单1所示:</P><A
name=code1><B>清单1:从一对字符串创建的类 </B></A> <BR>
<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0
width="100%"><TBODY>
<TR>
<TD><PRE><CODE>
public class TwoString {
private String m_s1, m_s2;
public TwoString(String s1, String s2) {
m_s1 = s1;
m_s2 = s2;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -