📄 java 编程的动态性,第 1 部分:类和类装入.htm
字号:
<TR vAlign=top>
<TD bgColor=#ffffff colSpan=5><IMG height=8 alt=""
src="Java 编程的动态性,第 1 部分:类和类装入.files/c.gif" width=100
border=0></TD></TR></TBODY></TABLE><!-- END HEADER AREA--><!-- START BODY AREA-->
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR vAlign=top>
<TD width=10><IMG height=1 alt=""
src="Java 编程的动态性,第 1 部分:类和类装入.files/c.gif" width=10 border=0></TD>
<TD width="100%">
<TABLE cellSpacing=0 cellPadding=0 width=168 align=right border=0>
<TBODY>
<TR><!-- Sidebar Gutter-->
<TD width=8><IMG height=21 alt=""
src="Java 编程的动态性,第 1 部分:类和类装入.files/c.gif" width=5></TD>
<TD width=160><!-- Start TOC-->
<TABLE cellSpacing=0 cellPadding=0 width=160 border=0>
<TBODY>
<TR>
<TD width=160 bgColor=#000000 height=1><IMG height=1 alt=""
src="Java 编程的动态性,第 1 部分:类和类装入.files/c.gif" width=160></TD></TR>
<TR>
<TD align=middle
background="Java 编程的动态性,第 1 部分:类和类装入.files/bg-gold.gif"
height=5><B>内容:</B></TD></TR>
<TR>
<TD width=160 bgColor=#666666 height=1><IMG height=1 alt=""
src="Java 编程的动态性,第 1 部分:类和类装入.files/c.gif" width=160></TD></TR>
<TR>
<TD align=right>
<TABLE cellSpacing=0 cellPadding=3 width="98%" border=0>
<TBODY>
<TR>
<TD><A
href="http://www-900.ibm.com/developerWorks/cn/java/j-dyn0429/#1">用二进制表示的类</A></TD></TR>
<TR>
<TD><A
href="http://www-900.ibm.com/developerWorks/cn/java/j-dyn0429/#2">字节码和堆栈</A></TD></TR>
<TR>
<TD><A
href="http://www-900.ibm.com/developerWorks/cn/java/j-dyn0429/#3">装入类</A></TD></TR>
<TR>
<TD><A
href="http://www-900.ibm.com/developerWorks/cn/java/j-dyn0429/#4">结束语</A></TD></TR>
<TR>
<TD><A
href="http://www-900.ibm.com/developerWorks/cn/java/j-dyn0429/#resources">参考资料</A></TD></TR>
<TR>
<TD><A
href="http://www-900.ibm.com/developerWorks/cn/java/j-dyn0429/#author1">关于作者</A></TD></TR>
<TR>
<TD><A
href="http://www-900.ibm.com/developerWorks/cn/java/j-dyn0429/#rating">对本文的评价</A></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><!-- End TOC--><!-- Start Related Content Area-->
<TABLE cellSpacing=0 cellPadding=0 width=160 border=0>
<TBODY>
<TR>
<TD width=160 bgColor=#000000 height=1><IMG height=1 alt=""
src="Java 编程的动态性,第 1 部分:类和类装入.files/c.gif" width=160></TD></TR>
<TR>
<TD align=middle
background="Java 编程的动态性,第 1 部分:类和类装入.files/bg-gold.gif"
height=5><B>相关内容:</B></TD></TR>
<TR>
<TD width=160 bgColor=#666666 height=1><IMG height=1 alt=""
src="Java 编程的动态性,第 1 部分:类和类装入.files/c.gif" width=160></TD></TR>
<TR>
<TD align=right>
<TABLE cellSpacing=0 cellPadding=3 width="98%" border=0>
<TBODY>
<TR>
<TD><A
href="http://www-900.ibm.com/developerWorks/cn/cnedu.nsf/java-onlinecourse-bytitle/AED03F980AC3C03C48256A7600222BB5?OpenDocument">教程:了解
Java ClassLoader</A></TD></TR>
<TR>
<TD><A
href="http://www-900.ibm.com/developerWorks/cn/java/j-native/index.shtml">衡量
Java 本机编译</A></TD></TR>
<TR>
<TD><A
href="http://www-900.ibm.com/developerWorks/cn/java/j-obfus/index.shtml">如何封锁您的(或打开别人的)
Java 代码</A></TD></TR>
<TR>
<TD><A
href="http://www-106.ibm.com/developerworks/java/library/j-jalapeno/">The
Jikes Research Virtual Machine (RVM)</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 cellSpacing=0 cellPadding=0 width=160 border=0>
<TBODY>
<TR>
<TD width=160 bgColor=#000000 height=1><IMG height=1 alt=""
src="Java 编程的动态性,第 1 部分:类和类装入.files/c.gif" width=160></TD></TR>
<TR>
<TD align=middle
background="Java 编程的动态性,第 1 部分:类和类装入.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 width=160 bgColor=#666666 height=1><IMG height=1 alt=""
src="Java 编程的动态性,第 1 部分:类和类装入.files/c.gif" width=160></TD></TR>
<TR>
<TD align=right>
<TABLE cellSpacing=0 cellPadding=3 width="98%" border=0>
<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 cellSpacing=0 cellPadding=0 width=160 border=0>
<TBODY>
<TR>
<TD width=150 bgColor=#000000 colSpan=2 height=2><IMG height=2
alt="" src="Java 编程的动态性,第 1 部分:类和类装入.files/c.gif"
width=160></TD></TR>
<TR>
<TD width=150 bgColor=#ffffff colSpan=2 height=2><IMG height=2
alt="" src="Java 编程的动态性,第 1 部分:类和类装入.files/c.gif"
width=160></TD></TR></TBODY></TABLE><!-- END STANDARD SIDEBAR AREA--></TD></TR></TBODY></TABLE><SPAN
class=atitle2>研究类以及 JVM 装入类时所发生的情况</SPAN><BR>级别:中级
<P><A
href="http://www-900.ibm.com/developerWorks/cn/java/j-dyn0429/#author1">Dennis
M. Sosnoski</A>(<A
href="mailto:dms@sosnoski.com">dms@sosnoski.com</A>)<BR><!-- <a href="#author2">Author name</a> (<a href="mailto:userid@us.ibm.com">email address</a>)<br /> -->总裁,Sosnoski
Software Solutions, Inc.<BR>2003 年 6 月 </P>
<BLOCKQUOTE>这一有关 Java 编程动态方面的新的系列文章研究了执行 Java 应用程序时幕后所发生的事情。企业 Java 专家
Dennis Sosnoski 提供了 Java 二进制类格式以及在 JVM
内部类所发生的情况的内幕。接着,他将讨论类装入问题,其范围涉及从运行简单的 Java 应用程序所需的类的数量到可能造成 J2EE
及类似的复杂体系结构出现问题的类装入器冲突。</BLOCKQUOTE>
<P>本文是这个新系列文章的第一篇,该系列文章将讨论我称之为 <I
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Java
编程的动态性</I>的一系列主题。这些主题的范围从 Java
二进制类文件格式的基本结构,以及使用反射进行运行时元数据访问,一直到在运行时修改和构造新类。贯穿整篇文章的公共线索是这样一种思想:在 Java
平台上编程要比使用直接编译成本机代码的语言更具动态性。如果您理解了这些动态方面,就可以使用 Java
编程完成那些在任何其它主流编程语言中不能完成的事情。</P>
<P>本文中,我将讨论一些基本概念,它们是这些 Java 平台动态特性的基础。这些概念的核心是用于表示 Java 类的二进制格式,包括这些类装入到
JVM 时所发生的情况。本文不仅是本系列其余几篇文章的基础,而且还演示了开发人员在使用 Java 平台时碰到的一些非常实际的问题。</P>
<P><A name=1><SPAN class=atitle2>用二进制表示的类</SPAN></A><BR>使用 Java
语言的开发人员在用编译器编译他们的源代码时,通常不必关心对这些源代码做了些什么这样的细节。但是本系列文章中,我将讨论从源代码到执行程序所涉及的许多幕后细节,因此我将首先探讨由编译器生成的二进制类。</P>
<P>二进制类格式实际上是由 JVM 规范定义的。通常这些类表示是由编译器从 Java 语言源代码生成的,而且它们通常存储在扩展名为
<CODE>.class</CODE> 的文件中。但是,这些特性都无关紧要。已经开发了可以使用 Java
二进制类格式的其它一些编程语言,而且出于某些目的,还构建了新的类表示,并被立即装入到运行中的 JVM。就 JVM
而言,重要的部分不是源代码以及如何存储源代码,而是格式本身。</P>
<P>那么这个类格式实际看上去是什么样呢?清单 1 提供了一个(非常)简短的类的源代码,还附带了由编译器输出的类文件的部分十六进制显示:</P>
<P><B>清单 1. Hello.java 的源代码和(部分)二进制类文件</B><BR>
<TABLE cellSpacing=0 cellPadding=5 width="100%" bgColor=#cccccc
border=1><TBODY>
<TR>
<TD><PRE><CODE>
public class Hello
{
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
0000: cafe babe 0000 002e 001a 0a00 0600 0c09 ................
0010: 000d 000e 0800 0f0a 0010 0011 0700 1207 ................
0020: 0013 0100 063c 696e 6974 3e01 0003 2829 .....<init>...()
0030: 5601 0004 436f 6465 0100 046d 6169 6e01 V...Code...main.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -