?? 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 + -