﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-上善若水-随笔分类-深入源码</title><link>http://blogjava.net/DLevin/category/51678.html</link><description>In general the OO style is to use a lot of little objects with a lot of little methods that give us a lot of plug points for overriding and variation.
To do is to be -Nietzsche, To bei is to do -Kant, Do be do be do -Sinatra</description><language>zh-cn</language><lastBuildDate>Thu, 13 Aug 2015 10:50:28 GMT</lastBuildDate><pubDate>Thu, 13 Aug 2015 10:50:28 GMT</pubDate><ttl>60</ttl><item><title>深入perf4j源码</title><link>http://www.blogjava.net/DLevin/archive/2015/04/19/424527.html</link><dc:creator>DLevin</dc:creator><author>DLevin</author><pubDate>Sun, 19 Apr 2015 05:35:00 GMT</pubDate><guid>http://www.blogjava.net/DLevin/archive/2015/04/19/424527.html</guid><wfw:comment>http://www.blogjava.net/DLevin/comments/424527.html</wfw:comment><comments>http://www.blogjava.net/DLevin/archive/2015/04/19/424527.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/DLevin/comments/commentRss/424527.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/DLevin/services/trackbacks/424527.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 前言引用一老程序员同事的一句话：&#8220;项目做到最后就是监控了。&#8221;在一天和那同事打电话聊天时他突然冒出来的一句话。后来我仔细回味这句话，越来越觉得挺有道理的。自己在现在的项目里就做了好几个监控相关的任务，而且也一直在想办法获取更多的监控数据，如每个进程内存使用情况、线程使用状态、某些方法的性能等。不过这句话只说了一半，监控是为了获取数据，但是有了数据后还要根据这些数据来做相应的决...&nbsp;&nbsp;<a href='http://www.blogjava.net/DLevin/archive/2015/04/19/424527.html'>阅读全文</a><img src ="http://www.blogjava.net/DLevin/aggbug/424527.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/DLevin/" target="_blank">DLevin</a> 2015-04-19 13:35 <a href="http://www.blogjava.net/DLevin/archive/2015/04/19/424527.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>深入ASM源码之ClassReader、ClassVisitor、ClassWriter</title><link>http://www.blogjava.net/DLevin/archive/2014/06/25/414292.html</link><dc:creator>DLevin</dc:creator><author>DLevin</author><pubDate>Wed, 25 Jun 2014 13:14:00 GMT</pubDate><guid>http://www.blogjava.net/DLevin/archive/2014/06/25/414292.html</guid><wfw:comment>http://www.blogjava.net/DLevin/comments/414292.html</wfw:comment><comments>http://www.blogjava.net/DLevin/archive/2014/06/25/414292.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/DLevin/comments/commentRss/414292.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/DLevin/services/trackbacks/414292.html</trackback:ping><description><![CDATA[<h2><span style="color: #ff6600;">概述</span></h2>ASM是Java中比较流行的用来读写字节码的类库，用来基于字节码层面对代码进行分析和转换。在读写的过程中可以加入自定义的逻辑以增强或修改原来已编译好的字节码，比如CGLIB用它来实现动态代理。ASM被设计用于在运行时对Java类进行生成和转换，当然也包括离线处理。ASM短小精悍、且速度很快，从而避免在运行时动态生成字节码或转换时对程序速度的影响，又因为它体积小巧，可以在很多内存受限的环境中使用。<br />ASM的主要优势包括如下几个方面：<br />1. 它又一个很小，但设计良好并且模块化的API，且易于使用。<br />2. 它具有很好的文档，并且还有eclipse插件。<br />3. 它支持最新的Java版本。<br />4. 它短小精悍、快速、健壮。<br />5. 它又一个很大的用户社区，可以给新用户提供支持。<br />6. 它的开源许可允许你几乎以任何方式来使用它。<br /><br />关于ASM的详细文档可以参考：<a href="http://wenku.baidu.com/view/bf486c4577232f60ddcca133.html">ASM 3.0：Java字节码引擎库</a>，写的很详细的一个文档。<br /><h2><span style="color: #ff6600;">ASM Core设计一览</span></h2>在ASM的核心实现中，它主要有以下几个类、接口（在org.objectweb.asm包中）：<br />ClassReader类：字节码的读取与分析引擎。它采用类似SAX的事件读取机制，每当有事件发生时，调用注册的ClassVisitor、AnnotationVisitor、FieldVisitor、MethodVisitor做相应的处理。<br />ClassVisitor接口：定义在读取Class字节码时会触发的事件，如类头解析完成、注解解析、字段解析、方法解析等。<br />AnnotationVisitor接口：定义在解析注解时会触发的事件，如解析到一个基本值类型的注解、enum值类型的注解、Array值类型的注解、注解值类型的注解等。<br />FieldVisitor接口：定义在解析字段时触发的事件，如解析到字段上的注解、解析到字段相关的属性等。<br />MethodVisitor接口：定义在解析方法时触发的事件，如方法上的注解、属性、代码等。<br /><br />ClassWriter类：它实现了ClassVisitor接口，用于拼接字节码。<br />AnnotationWriter类：它实现了AnnotationVisitor接口，用于拼接注解相关字节码。<br />FieldWriter类：它实现了FieldVisitor接口，用于拼接字段相关字节码。<br />MethodWriter类：它实现了MethodVisitor接口，用于拼接方法相关字节码。<br /><br />SignatureReader类：对类定义、字段定义、方法定义、本地变量定义的签名的解析。Signature因范型引入，用于存储范型定义时的元数据（因为这些元数据在运行时会被擦除）。<br />SignatureVisitor接口：定义在解析Signature时会触发的事件，如正常的Type参数、类或接口的边界等。<br />SignatureWriter类：它实现了SignatureVisitor接口，用于拼接范型相关字节码。<br /><br />Attribute类：字节码中属性的类抽象。<br />ByteVector类：字节码二进制存储的容器。<br />Opcodes接口：字节码指令的一些常量定义。<br />Type类：类型相关的常量定义以及一些基于其上的操作。<br /><br />他们之间的类图关系如下：<br /><img src="http://www.blogjava.net/images/blogjava_net/dlevin/ASM_Core.jpg" alt="" height="1047" width="1118" /><br /><h2><span style="color: #ff6600;">ClassReader实现</span></h2>ClassReader是ASM中最核心的实现，它用于读取并解析Class字节码。类字节码格式可以具体参考：<a href="http://www.blogjava.net/DLevin/archive/2011/09/05/358033.html">《Java字节码格式详解1》</a>、<a href="http://www.blogjava.net/DLevin/archive/2011/09/05/358034.html">《Java字节码格式详解2》</a>、<a href="http://www.blogjava.net/DLevin/archive/2011/09/05/358035.html">《Java字节码格式详解3》</a><br /><br />在构建ClassReader实例时，它首先保存字节码二进制数组b，然后创建items数组，数组的长度在字节码数组的第8、9个字节指定（最前面4个字节是魔数CAFEBABE，之后2个字节是次版本号，再后2个字节是主版本号），每个item表示常量池项在字节码数组的偏移量加1（常量池中每个项由1个字节的type和紧跟的字节数组表示，常量池项有12种类型，其中CONSTANT_FieldRef_Info、CONSTANT_MethodRef_Info、CONSTANT_InterfaceMethodRef_Info、CONSTANT_NameAndType_Info包括其类型字节占用5个字节，另外4个字节每2个字节为字段、方法等所在的类、其名称、描述符在当前常量池中CONSTANT_Utf8_Info类型的引用；CONSTANT_Integer_Info、CONSTANT_Float_Info包括其类型字节占用5个字节，另外四个字节为其对应的值；CONSTANT_Class_Info、CONSTANT_String_Info包括其类型字节占用3个字节，另外两个字节为在当前常量池CONSTANT_Utf8_Info项的索引；CONSTANT_Utf8_Info类型第1个字节表示类型，第2、3个字节为该项所表示的字符串的长度）；CONSTANT_Double_Info、CONSTANT_Long_Info加类型字节为9个字；maxStringLength表示最长的UTF8类型的常量池项的值，用于决定在解析CONSTANT_Utf8_Info类型项时最大需要的字符数组；header表示常量池之后的字节码的第一个字节。<br /><br />在调用ClassReader的accept方法时，它解析字节码中常量池之后的所有元素。紧接着常量池的2个字节是该类的access标签：ACC_PUBLIC、ACC_FINAL等；之后2个字节为当前类名在常量池CONSTANT_Utf8_Info类型的索引；之后2个字节为其父类名在常量池CONSTANT_Utf8_Info类型的索引（索引值0表示父类为null，即直接继承自Object类）；再之后为其实现的接口数长度和对应各个接口名在常量池中CONSTANT_Utf8_Info类型的索引值；暂时先跳过Field和Method定义信息，解析类的attribute表，它用两个字节表达attribute数组的长度，每个attribute项中最前面2个字节是attribute名称：SourceFile（读取sourceFile值）、InnerClasses（暂时纪录起始索引）、EnclosingMethod（纪录当前匿名类、本地类包含者类名以及包含者的方法名和描述符）、Signature（类的签名信息，用于范型）、RuntimeVisibleAnnotations（暂时纪录起始索引）、Deprecated（表识属性）、Synthetic（标识属性）、SourceDebugExtension（为调试器提供的自定义扩展信息，读取成一个字符串）、RuntimeInvisibleAnnotations（暂时纪录起始索引），对其他不识别的属性，纪录成Attribute链，如果attribute名称符合在accept中attribute数组中指定的attribute名，则替换传入的attribute数组对应的项；根据解析出来的信息调用以下visit方法：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">void</span>&nbsp;visit(<span style="color: #0000FF; ">int</span>&nbsp;version,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;access,&nbsp;String&nbsp;name,&nbsp;String&nbsp;signature,&nbsp;String&nbsp;superName,&nbsp;String[]&nbsp;interfaces);<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;sourceFile,&nbsp;sourceDebug</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">void</span>&nbsp;visitSource(String&nbsp;source,&nbsp;String&nbsp;debug);<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;EnclosingMethod&nbsp;attribute:&nbsp;enclosingOwner,&nbsp;enclosingName,&nbsp;enclosingDesc.&nbsp;<br /></span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;Note: only when the class has EnclosingMethod attribute, meaning the class is a local class or an anonymous class</span><br /><span style="color: #0000FF; ">void</span>&nbsp;visitOuterClass(String&nbsp;owner,&nbsp;String&nbsp;name,&nbsp;String&nbsp;desc);</div><br />依次解析RuntimeVisibleAnnotations和RuntimeInvisibleAnnotations属性，首先解析定义的Annotation的描述符以及运行时可见flag，返回用户自定义的AnnotationVisitor：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->AnnotationVisitor&nbsp;visitAnnotation(String&nbsp;desc,&nbsp;<span style="color: #0000FF; ">boolean</span>&nbsp;visible);</div>对每个定义的Annotation，解析其键值对，并根据不同的Annotation字段值调用AnnotationVisitor中的方法，在所有解析结束后，调用AnnotationVisitor.visitEnd方法：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">interface</span>&nbsp;AnnotationVisitor&nbsp;{<br />&nbsp; &nbsp;&nbsp;<span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;对基本类型的数组，依然采用该方法，visitArray只是在非基本类型时调用。</span><br />&nbsp; &nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;visit(String&nbsp;name,&nbsp;Object&nbsp;value);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;visitEnum(String&nbsp;name,&nbsp;String&nbsp;desc,&nbsp;String&nbsp;value);<br />&nbsp;&nbsp;&nbsp;&nbsp;AnnotationVisitor&nbsp;visitAnnotation(String&nbsp;name,&nbsp;String&nbsp;desc);<br />&nbsp;&nbsp;&nbsp;&nbsp;AnnotationVisitor&nbsp;visitArray(String&nbsp;name);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;visitEnd();<br />}</div><br />之前解析出的attribute链表（非标准的Attribute定义），对每个Attribute实例，调用ClassVisitor中的visitAttribute方法：<br /><div style="font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; background-color: #eeeeee;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">void</span>&nbsp;visitAttribute(Attribute&nbsp;attr);</div>Attribute类包含type字段和一个字节数组：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;Attribute&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">final</span>&nbsp;String&nbsp;type;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">byte</span>[]&nbsp;value;<br />&nbsp;&nbsp;&nbsp;&nbsp;Attribute&nbsp;next;<br />}</div><br />对每个InnerClasses属性，解析并调用ClassVisitor的visitInnerClass方法（该属性事实上保存了所有其直接内部类以及它本身到最顶层类的路径）：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">void</span>&nbsp;visitInnerClass(String&nbsp;name,&nbsp;String&nbsp;outerName,&nbsp;String&nbsp;innerName,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;access);</div><br />解析字段，它紧跟接口数组定义之后，最前面的2个字节为字段数组的长度，对每个字段，前面2个字节为访问flag定义，再后2个字节为Name索引，以及2个字节的描述符索引，然后解析其Attribute信息：ConstantValue、Signature、Deprecated、Synthetic、RuntimeVisibleAnnotations、RuntimeInvisibleAnnotations以及非标准定义的Attribute链，而后调用ClassVisitor的visitField方法，返回FieldVisitor实例：<br /><div style="font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; background-color: #eeeeee;"><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;其中value为静态字段的初始化值（对非静态字段，它的初始化必须由构造函数实现），如果没有初始化值，该值为null。</span><br />FieldVisitor&nbsp;visitField(<span style="color: #0000FF; ">int</span>&nbsp;access,&nbsp;String&nbsp;name,&nbsp;String&nbsp;desc,&nbsp;String&nbsp;signature,&nbsp;Object&nbsp;value);</div>对返回的FieldVisitor依次对其Annotation以及非标准Attribute解析，调用其visit方法，并在完成后调用它的visitEnd方法：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">interface</span>&nbsp;FieldVisitor&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;AnnotationVisitor&nbsp;visitAnnotation(String&nbsp;desc,&nbsp;<span style="color: #0000FF; ">boolean</span>&nbsp;visible);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;visitAttribute(Attribute&nbsp;attr);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;visitEnd();<br />}</div><br />解析方法定义，它紧跟字段定义之后，最前面的2个字节为方法数组长度，对每个方法，前面2个字节为访问flag定义，再后2个字节为Name索引，以及2个字节的方法描述符索引，然后解析其Attribute信息：Code、Exceptions、Signature、Deprecated、RuntimeVisibleAnnotations、AnnotationDefault、Synthetic、RuntimeInvisibleAnnotations、RuntimeVisibleParameterAnnotations、RuntimeInvisibleParameterAnnotations以及非标准定义的Attribute链，如果存在Exceptions属性，解析其异常类数组，之后调用ClassVisitor的visitMethod方法，返回MethodVisitor实例：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->MethodVisitor&nbsp;visitMethod(<span style="color: #0000FF; ">int</span>&nbsp;access,&nbsp;String&nbsp;name,&nbsp;String&nbsp;desc,&nbsp;String&nbsp;signature,&nbsp;String[]&nbsp;exceptions);</div><br />AnnotationDefault为对Annotation定义时指定默认值的解析；然后依次解析RuntimeVisibleAnnotations、RuntimeInvisibleAnnotations、RuntimeVisibleParameterAnnotations、RuntimeInvisibleParameterAnnotations等属性，调用相关AnnotationVisitor的visit方法；对非标准定义的Attribute链，依次调用MethodVisitor的visitAttribute方法：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">interface</span>&nbsp;MethodVisitor&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;AnnotationVisitor&nbsp;visitAnnotationDefault();<br />&nbsp;&nbsp;&nbsp;&nbsp;AnnotationVisitor&nbsp;visitAnnotation(String&nbsp;desc,&nbsp;<span style="color: #0000FF; ">boolean</span>&nbsp;visible);<br />&nbsp;&nbsp;&nbsp;&nbsp;AnnotationVisitor&nbsp;visitParameterAnnotation(<span style="color: #0000FF; ">int</span>&nbsp;parameter,&nbsp;String&nbsp;desc,&nbsp;<span style="color: #0000FF; ">boolean</span>&nbsp;visible);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;visitAttribute(Attribute&nbsp;attr);<br />}</div><br />对Code属性解析，读取2个字节的最深栈大小、最大local变量数、code占用字节数，调用MethodVisitor的visitCode()方法表示开始解析Code属性，对每条指令，创建一个Label实例并构成Label数组，解析Code属性中的异常表，对每个异常项，调用visitTryCatchBlock方法：<br /><div style="font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; background-color: #eeeeee;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">void</span>&nbsp;visitTryCatchBlock(Label&nbsp;start,&nbsp;Label&nbsp;end,&nbsp;Label&nbsp;handler,&nbsp;String&nbsp;type);</div>Label包含以下信息：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;*&nbsp;A&nbsp;label&nbsp;represents&nbsp;a&nbsp;position&nbsp;in&nbsp;the&nbsp;bytecode&nbsp;of&nbsp;a&nbsp;method.&nbsp;Labels&nbsp;are&nbsp;used<br />&nbsp;*&nbsp;for&nbsp;jump,&nbsp;goto,&nbsp;and&nbsp;switch&nbsp;instructions,&nbsp;and&nbsp;for&nbsp;try&nbsp;catch&nbsp;blocks.<br />&nbsp;*&nbsp;<br />&nbsp;*&nbsp;</span><span style="color: #808080; ">@author</span><span style="color: #008000; ">&nbsp;Eric&nbsp;Bruneton<br />&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;Label&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;Object&nbsp;info;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;status;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;line;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;position;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;referenceCount;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">int</span>[]&nbsp;srcAndRefPositions;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;inputStackTop;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;outputStackMax;<br />&nbsp;&nbsp;&nbsp;&nbsp;Frame&nbsp;frame;<br />&nbsp;&nbsp;&nbsp;&nbsp;Label&nbsp;successor;<br />&nbsp;&nbsp;&nbsp;&nbsp;Edge&nbsp;successors;<br />&nbsp;&nbsp;&nbsp;&nbsp;Label&nbsp;next;<br />}</div>解析Code属性中的内部属性信息：LocalVariableTable、LocalVariableTypeTable、LineNumberTable、StackMapTable、StackMap以及非标准定义的Attribute链，对每个Label调用其visitLineNumber方法以及对每个Frame调用visitFrame方法，并且对相应的指令调用相应的方法：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><span style="color: #0000FF; ">void</span>&nbsp;visitFrame(<span style="color: #0000FF; ">int</span>&nbsp;type,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nLocal,&nbsp;Object[]&nbsp;local,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nStack,&nbsp;Object[]&nbsp;stack);<span style="color: #008000; "><br />// Visits&nbsp;a&nbsp;zero&nbsp;operand&nbsp;instruction.</span><br /><span style="color: #0000FF; ">void</span>&nbsp;visitInsn(<span style="color: #0000FF; ">int</span>&nbsp;opcode);<br /><span style="color: #008000; ">// Visits&nbsp;an&nbsp;instruction&nbsp;with&nbsp;a&nbsp;single&nbsp;int&nbsp;operand.</span><br /><span style="color: #0000FF; ">void</span>&nbsp;visitIntInsn(<span style="color: #0000FF; ">int</span>&nbsp;opcode,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;operand);<br /><span style="color: #008000; ">// Visits&nbsp;a&nbsp;local&nbsp;variable&nbsp;instruction.&nbsp;A&nbsp;local&nbsp;variable&nbsp;instruction&nbsp;is&nbsp;an&nbsp;instruction&nbsp;that&nbsp;loads&nbsp;or&nbsp;stores&nbsp;the&nbsp;value&nbsp;of&nbsp;a&nbsp;local&nbsp;variable.<br /></span><span style="color: #0000FF; ">void</span>&nbsp;visitVarInsn(<span style="color: #0000FF; ">int</span>&nbsp;opcode,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;var);<br /><span style="color: #008000; ">// Visits&nbsp;a&nbsp;type&nbsp;instruction.&nbsp;A&nbsp;type&nbsp;instruction&nbsp;is&nbsp;an&nbsp;instruction&nbsp;that&nbsp;takes&nbsp;the&nbsp;internal&nbsp;name&nbsp;of&nbsp;a&nbsp;class&nbsp;as&nbsp;parameter.<br /></span><span style="color: #0000FF; ">void</span>&nbsp;visitTypeInsn(<span style="color: #0000FF; ">int</span>&nbsp;opcode,&nbsp;String&nbsp;type);<br /><span style="color: #008000; ">// Visits&nbsp;a&nbsp;field&nbsp;instruction.&nbsp;A&nbsp;field&nbsp;instruction&nbsp;is&nbsp;an&nbsp;instruction&nbsp;that&nbsp;loads&nbsp;or&nbsp;stores&nbsp;the&nbsp;value&nbsp;of&nbsp;a&nbsp;field&nbsp;of&nbsp;an&nbsp;object.<br /></span><span style="color: #0000FF; ">void</span>&nbsp;visitFieldInsn(<span style="color: #0000FF; ">int</span>&nbsp;opcode,&nbsp;String&nbsp;owner,&nbsp;String&nbsp;name,&nbsp;String&nbsp;desc);<br /><span style="color: #008000; ">// Visits&nbsp;a&nbsp;method&nbsp;instruction.&nbsp;A&nbsp;method&nbsp;instruction&nbsp;is&nbsp;an&nbsp;instruction&nbsp;that&nbsp;invokes&nbsp;a&nbsp;method.<br /></span><span style="color: #0000FF; ">void</span>&nbsp;visitMethodInsn(<span style="color: #0000FF; ">int</span>&nbsp;opcode,&nbsp;String&nbsp;owner,&nbsp;String&nbsp;name,&nbsp;String&nbsp;desc);<br /><span style="color: #008000; ">// Visits&nbsp;a&nbsp;jump&nbsp;instruction.&nbsp;A&nbsp;jump&nbsp;instruction&nbsp;is&nbsp;an&nbsp;instruction&nbsp;that&nbsp;may&nbsp;jump&nbsp;to&nbsp;another&nbsp;instruction.<br /></span><span style="color: #0000FF; ">void</span>&nbsp;visitJumpInsn(<span style="color: #0000FF; ">int</span>&nbsp;opcode,&nbsp;Label&nbsp;label);<br /><span style="color: #008000; ">// Visits&nbsp;a&nbsp;label.&nbsp;A&nbsp;label&nbsp;designates&nbsp;the&nbsp;instruction&nbsp;that&nbsp;will&nbsp;be&nbsp;visited&nbsp;just&nbsp;after&nbsp;it.<br /></span><span style="color: #0000FF; ">void</span>&nbsp;visitLabel(Label&nbsp;label);<br /><span style="color: #008000; ">// Visits&nbsp;a&nbsp;LDC&nbsp;instruction.<br /></span><span style="color: #0000FF; ">void</span>&nbsp;visitLdcInsn(Object&nbsp;cst);<br /><span style="color: #008000; ">// Visits&nbsp;an&nbsp;IINC&nbsp;instruction.<br /></span><span style="color: #0000FF; ">void</span>&nbsp;visitIincInsn(<span style="color: #0000FF; ">int</span>&nbsp;var,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;increment);<br /><span style="color: #008000; ">// Visits&nbsp;a&nbsp;TABLESWITCH&nbsp;instruction.<br /></span><span style="color: #0000FF; ">void</span>&nbsp;visitTableSwitchInsn(<span style="color: #0000FF; ">int</span>&nbsp;min,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;max,&nbsp;Label&nbsp;dflt,&nbsp;Label[]&nbsp;labels);<br /><span style="color: #008000; ">// Visits&nbsp;a&nbsp;LOOKUPSWITCH&nbsp;instruction.<br /></span><span style="color: #0000FF; ">void</span>&nbsp;visitLookupSwitchInsn(Label&nbsp;dflt,&nbsp;<span style="color: #0000FF; ">int</span>[]&nbsp;keys,&nbsp;Label[]&nbsp;labels);<br /><span style="color: #008000; ">// Visits&nbsp;a&nbsp;MULTIANEWARRAY&nbsp;instruction.<br /></span><span style="color: #0000FF; ">void</span>&nbsp;visitMultiANewArrayInsn(String&nbsp;desc,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;dims);<br /><span style="color: #008000; ">// Visits&nbsp;a&nbsp;try&nbsp;catch&nbsp;block.<br /></span><span style="color: #0000FF; ">void</span>&nbsp;visitTryCatchBlock(Label&nbsp;start,&nbsp;Label&nbsp;end,&nbsp;Label&nbsp;handler,&nbsp;String&nbsp;type);<br /><span style="color: #0000FF; ">void</span>&nbsp;visitLocalVariable(String&nbsp;name,&nbsp;String&nbsp;desc,&nbsp;String&nbsp;signature,&nbsp;Label&nbsp;start,&nbsp;Label&nbsp;end,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;index);<br /><span style="color: #008000; ">// Visits&nbsp;a&nbsp;line&nbsp;number&nbsp;declaration.<br /></span><span style="color: #0000FF; ">void</span>&nbsp;visitLineNumber(<span style="color: #0000FF; ">int</span>&nbsp;line,&nbsp;Label&nbsp;start);<br /><span style="color: #008000; ">// Visits&nbsp;the&nbsp;maximum&nbsp;stack&nbsp;size&nbsp;and&nbsp;the&nbsp;maximum&nbsp;number&nbsp;of&nbsp;local&nbsp;variables&nbsp;of&nbsp;the&nbsp;method.<br /></span><span style="color: #0000FF; ">void</span>&nbsp;visitMaxs(<span style="color: #0000FF; ">int</span>&nbsp;maxStack,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;maxLocals);</div><br /><br />最后调用ClassVisitor的visitEnd方法：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">void</span>&nbsp;visitEnd();</div><br /><h2><span style="color: #ff6600;">ClassWriter实现</span></h2>ClassWriter继承自ClassVisitor接口，可以使用它调用其相应的visit方法动态的构造一个字节码类。它包含以下字段信息：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;ClassWriter&nbsp;<span style="color: #0000FF; ">implements</span>&nbsp;ClassVisitor&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">The&nbsp;class&nbsp;reader&nbsp;from&nbsp;which&nbsp;this&nbsp;class&nbsp;writer&nbsp;was&nbsp;constructed,&nbsp;if&nbsp;any.</span><br />&nbsp;&nbsp;&nbsp;&nbsp;ClassReader&nbsp;cr;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">Minor&nbsp;and&nbsp;major&nbsp;version&nbsp;numbers&nbsp;of&nbsp;the&nbsp;class&nbsp;to&nbsp;be&nbsp;generated.</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;version;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">Index&nbsp;of&nbsp;the&nbsp;next&nbsp;item&nbsp;to&nbsp;be&nbsp;added&nbsp;in&nbsp;the&nbsp;constant&nbsp;pool.</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;index;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">The&nbsp;constant&nbsp;pool&nbsp;of&nbsp;this&nbsp;class.</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">final</span>&nbsp;ByteVector&nbsp;pool;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">The&nbsp;constant&nbsp;pool's&nbsp;hash&nbsp;table&nbsp;data.</span><br />&nbsp;&nbsp;&nbsp;&nbsp;Item[]&nbsp;items;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">The&nbsp;threshold&nbsp;of&nbsp;the&nbsp;constant&nbsp;pool's&nbsp;hash&nbsp;table.</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;threshold;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">A&nbsp;reusable&nbsp;key&nbsp;used&nbsp;to&nbsp;look&nbsp;for&nbsp;items&nbsp;in&nbsp;the&nbsp;{</span><span style="color: #808080; ">@link</span><span style="color: #008000; ">&nbsp;#items}&nbsp;hash&nbsp;table.</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">final</span>&nbsp;Item&nbsp;key;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">A&nbsp;reusable&nbsp;key&nbsp;used&nbsp;to&nbsp;look&nbsp;for&nbsp;items&nbsp;in&nbsp;the&nbsp;{</span><span style="color: #808080; ">@link</span><span style="color: #008000; ">&nbsp;#items}&nbsp;hash&nbsp;table.</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">final</span>&nbsp;Item&nbsp;key2;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">A&nbsp;reusable&nbsp;key&nbsp;used&nbsp;to&nbsp;look&nbsp;for&nbsp;items&nbsp;in&nbsp;the&nbsp;{</span><span style="color: #808080; ">@link</span><span style="color: #008000; ">&nbsp;#items}&nbsp;hash&nbsp;table.</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">final</span>&nbsp;Item&nbsp;key3;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">A&nbsp;type&nbsp;table&nbsp;used&nbsp;to&nbsp;temporarily&nbsp;store&nbsp;internal&nbsp;names&nbsp;that&nbsp;will&nbsp;not&nbsp;necessarily&nbsp;be&nbsp;stored&nbsp;in&nbsp;the&nbsp;constant&nbsp;pool.&nbsp;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;Item[]&nbsp;typeTable;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">Number&nbsp;of&nbsp;elements&nbsp;in&nbsp;the&nbsp;{</span><span style="color: #808080; ">@link</span><span style="color: #008000; ">&nbsp;#typeTable}&nbsp;array.</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">short</span>&nbsp;typeCount;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">The&nbsp;access&nbsp;flags&nbsp;of&nbsp;this&nbsp;class.</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;access;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">The&nbsp;constant&nbsp;pool&nbsp;item&nbsp;that&nbsp;contains&nbsp;the&nbsp;internal&nbsp;name&nbsp;of&nbsp;this&nbsp;class.</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;name;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">The&nbsp;internal&nbsp;name&nbsp;of&nbsp;this&nbsp;class.</span><br />&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;thisName;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">The&nbsp;constant&nbsp;pool&nbsp;item&nbsp;that&nbsp;contains&nbsp;the&nbsp;signature&nbsp;of&nbsp;this&nbsp;class.</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;signature;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">The&nbsp;constant&nbsp;pool&nbsp;item&nbsp;that&nbsp;contains&nbsp;the&nbsp;internal&nbsp;name&nbsp;of&nbsp;the&nbsp;super&nbsp;class&nbsp;of&nbsp;this&nbsp;class.</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;superName;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Number&nbsp;of&nbsp;interfaces&nbsp;implemented&nbsp;or&nbsp;extended&nbsp;by&nbsp;this&nbsp;class&nbsp;or&nbsp;interface.</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;interfaceCount;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">The&nbsp;interfaces&nbsp;implemented&nbsp;or&nbsp;extended&nbsp;by&nbsp;this&nbsp;class&nbsp;or&nbsp;interface.&nbsp;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">int</span>[]&nbsp;interfaces;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">The&nbsp;index&nbsp;of&nbsp;the&nbsp;constant&nbsp;pool&nbsp;item&nbsp;that&nbsp;contains&nbsp;the&nbsp;name&nbsp;of&nbsp;the&nbsp;source&nbsp;file&nbsp;from&nbsp;which&nbsp;this&nbsp;class&nbsp;was&nbsp;compiled.</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;sourceFile;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">The&nbsp;SourceDebug&nbsp;attribute&nbsp;of&nbsp;this&nbsp;class.</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;ByteVector&nbsp;sourceDebug;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">The&nbsp;constant&nbsp;pool&nbsp;item&nbsp;that&nbsp;contains&nbsp;the&nbsp;name&nbsp;of&nbsp;the&nbsp;enclosing&nbsp;class&nbsp;of&nbsp;this&nbsp;class.</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;enclosingMethodOwner;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">The&nbsp;constant&nbsp;pool&nbsp;item&nbsp;that&nbsp;contains&nbsp;the&nbsp;name&nbsp;and&nbsp;descriptor&nbsp;of&nbsp;the&nbsp;enclosing&nbsp;method&nbsp;of&nbsp;this&nbsp;class.<br /></span>&nbsp; &nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;enclosingMethod;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">The&nbsp;runtime&nbsp;visible&nbsp;annotations&nbsp;of&nbsp;this&nbsp;class.</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;AnnotationWriter&nbsp;anns;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">The&nbsp;runtime&nbsp;invisible&nbsp;annotations&nbsp;of&nbsp;this&nbsp;class.</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;AnnotationWriter&nbsp;ianns;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">The&nbsp;non&nbsp;standard&nbsp;attributes&nbsp;of&nbsp;this&nbsp;class.<br /></span>&nbsp; &nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;Attribute&nbsp;attrs;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">The&nbsp;number&nbsp;of&nbsp;entries&nbsp;in&nbsp;the&nbsp;InnerClasses&nbsp;attribute.<br /></span>&nbsp; &nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;innerClassesCount;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">The&nbsp;InnerClasses&nbsp;attribute.</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;ByteVector&nbsp;innerClasses;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">The&nbsp;fields&nbsp;of&nbsp;this&nbsp;class.&nbsp;These&nbsp;fields&nbsp;are&nbsp;stored&nbsp;in&nbsp;a&nbsp;linked&nbsp;list&nbsp;of&nbsp;{</span><span style="color: #808080; ">@link</span><span style="color: #008000; ">&nbsp;FieldWriter}&nbsp;objects,&nbsp;linked&nbsp;to&nbsp;each&nbsp;other&nbsp;by&nbsp;their&nbsp;{</span><span style="color: #808080; ">@link</span><span style="color: #008000; ">&nbsp;FieldWriter#next}&nbsp;field.&nbsp;This&nbsp;field&nbsp;stores&nbsp;the&nbsp;first&nbsp;element&nbsp;of&nbsp;this&nbsp;list.</span><br />&nbsp;&nbsp;&nbsp;&nbsp;FieldWriter&nbsp;firstField;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">This&nbsp;field&nbsp;stores&nbsp;the&nbsp;last&nbsp;element&nbsp;of&nbsp;this&nbsp;list.</span><br />&nbsp;&nbsp;&nbsp;&nbsp;FieldWriter&nbsp;lastField;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">The&nbsp;methods&nbsp;of&nbsp;this&nbsp;class.&nbsp;These&nbsp;methods&nbsp;are&nbsp;stored&nbsp;in&nbsp;a&nbsp;linked&nbsp;list&nbsp;of&nbsp;{</span><span style="color: #808080; ">@link</span><span style="color: #008000; ">&nbsp;MethodWriter}&nbsp;objects,&nbsp;linked&nbsp;to&nbsp;each&nbsp;other&nbsp;by&nbsp;their&nbsp;{</span><span style="color: #808080; ">@link</span><span style="color: #008000; ">&nbsp;MethodWriter#next}&nbsp;field.&nbsp;This&nbsp;field&nbsp;stores&nbsp;the&nbsp;first&nbsp;element&nbsp;of&nbsp;this&nbsp;list.</span><br />&nbsp;&nbsp;&nbsp;&nbsp;MethodWriter&nbsp;firstMethod;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">This&nbsp;field&nbsp;stores&nbsp;the&nbsp;last&nbsp;element&nbsp;of&nbsp;this&nbsp;list.</span><br />&nbsp;&nbsp;&nbsp;&nbsp;MethodWriter&nbsp;lastMethod;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/</span><span style="color: #008000; ">/true if&nbsp;the&nbsp;maximum&nbsp;stack&nbsp;size&nbsp;and&nbsp;number&nbsp;of&nbsp;local&nbsp;variables&nbsp;must&nbsp;be&nbsp;automatically&nbsp;computed.</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">final</span>&nbsp;<span style="color: #0000FF; ">boolean</span>&nbsp;computeMaxs;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">true if&nbsp;the&nbsp;stack&nbsp;map&nbsp;frames&nbsp;must&nbsp;be&nbsp;recomputed&nbsp;from&nbsp;scratch.</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">final</span>&nbsp;<span style="color: #0000FF; ">boolean</span>&nbsp;computeFrames;<br />&nbsp; &nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">true if&nbsp;the&nbsp;stack&nbsp;map&nbsp;tables&nbsp;of&nbsp;this&nbsp;class&nbsp;are&nbsp;invalid.&nbsp;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">boolean</span>&nbsp;invalidFrames;<br />}</div><br /><div></div><img src ="http://www.blogjava.net/DLevin/aggbug/414292.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/DLevin/" target="_blank">DLevin</a> 2014-06-25 21:14 <a href="http://www.blogjava.net/DLevin/archive/2014/06/25/414292.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>