<div class="htmledit_views" id="content_views">
<span style="font-family:'Microsoft YaHei';"><span style="font-size:14px;"><strong></strong></span></span>
<h4><span style="font-family:'Microsoft YaHei';"><span style="font-size:14px;"><span style="font-family:'Comic Sans MS';">NO9.</span><span style="font-family:'Microsoft YaHei';"><span style="font-size:14px;"><strong><span style="font-size:14px;"><span style="font-family:'Microsoft YaHei';"><strong>类中引用到的field字段</strong>在常量池中是怎样描述的?(<span style="font-size:14px;"><span style="font-family:'Comic Sans MS';color:#ff6600;">CONSTANT_Fieldref_info</span><strong><span style="font-family:'Microsoft YaHei';">,</span></strong><span style="font-family:'Comic Sans MS';"> CONSTANT_Name_Type_info)</span></span><strong></strong></span></span></strong></span></span></span></span></h4> <p><span style="color:rgb(255,102,0);"><span style="font-size:14px;"><span style="font-family:'Microsoft YaHei';"> <span style="color:#000000;">一般而言,我们在定义类的过程中会定义一些<span style="font-family:'Microsoft YaHei';font-size:14px;"><span style="font-family:'Microsoft YaHei';font-size:14px;"><span style="font-family:'Comic Sans MS';"> field</span></span> </span>字段,然后会在这个类的其他地方(如方法中)使用到它。有可能我们在类的方法中只使用<span style="font-family:'Microsoft YaHei';font-size:14px;"><span style="font-family:'Microsoft YaHei';font-size:14px;"><span style="font-family:'Comic Sans MS';">field</span></span></span>字段一次,也有可能我们会在类定义的方法中使用它很多很多次。</span></span></span></span></p> <p><span style="font-family:'Microsoft YaHei';font-size:14px;color:#ff6600;"> <span style="color:#000000;">举一个简单的例子,我们定一个叫<span style="font-family:'Comic Sans MS';color:#FF6600;">Person</span>的简单<span style="font-family:'Comic Sans MS';">java bean</span>,它有<span style="font-family:'Comic Sans MS';color:#FF6600;">name</span>和<span style="font-family:'Comic Sans MS';color:#FF6600;">age</span>两个<span style="color:rgb(255,102,0);"><span style="font-size:14px;"><span style="font-family:'Microsoft YaHei';"><span style="color:#000000;"><span style="font-family:'Microsoft YaHei';font-size:14px;"><span style="font-family:'Microsoft YaHei';font-size:14px;"><span style="font-family:'Comic Sans MS';">field</span></span></span></span></span></span></span>字段,如下所示:</span></span></p> <blockquote dir="ltr"><pre><code class="language-java hljs"><ol class="hljs-ln"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-keyword">package</span> com.louis.jvm;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Person</span> </span>{</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="5"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">private</span> String name;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="6"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">private</span> <span class="hljs-keyword">int</span> age;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="7"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="8"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-function"><span class="hljs-keyword">public</span> String <span class="hljs-title">getName</span><span class="hljs-params">()</span> </span>{</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="9"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">return</span> name;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="10"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> }</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="11"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="12"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setName</span><span class="hljs-params">(String name)</span> </span>{</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="13"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">this</span>.name = name;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="14"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> }</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="15"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">int</span> <span class="hljs-title">getAge</span><span class="hljs-params">()</span> </span>{</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="16"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">return</span> age;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="17"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> }</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="18"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="19"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setAge</span><span class="hljs-params">(<span class="hljs-keyword">int</span> age)</span> </span>{</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="20"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">this</span>.age = age;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="21"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> }</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="22"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">}</div></div></li></ol></code><div class="hljs-button signin" data-title="登录后复制" onclick="hljs.signin(event)"></div></pre> <p><span style="font-family:'Microsoft YaHei';font-size:14px;"> </span></p> <p><span style="font-family:'Microsoft YaHei';font-size:14px;">在上面定义的类中,我们在<span style="font-family:'Microsoft YaHei';font-size:14px;color:#ff6600;"><span style="color:#000000;"><span style="font-family:'Comic Sans MS';color:#FF6600;">Person</span></span></span>类中的一系列方法里,多次引用到<span style="font-family:'Microsoft YaHei';font-size:14px;color:#ff6600;"><span style="color:#000000;"><span style="font-family:'Comic Sans MS';color:#FF6600;">name</span></span></span><span style="font-family:'Microsoft YaHei';font-size:14px;color:#ff6600;"><span style="color:#000000;"><span style="color:rgb(255,102,0);"><span style="font-size:14px;"><span style="font-family:'Microsoft YaHei';"><span style="color:#000000;"><span style="font-family:'Microsoft YaHei';font-size:14px;"><span style="font-family:'Microsoft YaHei';font-size:14px;"><span style="font-family:'Comic Sans MS';">field</span></span></span></span></span></span></span></span></span>字段 和<span style="font-family:'Microsoft YaHei';font-size:14px;color:#ff6600;"><span style="color:#000000;"><span style="font-family:'Comic Sans MS';color:#FF6600;">age</span></span></span><span style="font-family:'Microsoft YaHei';font-size:14px;color:#ff6600;"><span style="color:#000000;"><span style="color:rgb(255,102,0);"><span style="font-size:14px;"><span style="font-family:'Microsoft YaHei';"><span style="color:#000000;"><span style="font-family:'Microsoft YaHei';font-size:14px;"><span style="font-family:'Microsoft YaHei';font-size:14px;"><span style="font-family:'Comic Sans MS';">field</span></span></span></span></span></span></span></span></span>字段,对于JVM编译器而言,<span style="font-family:'Microsoft YaHei';font-size:14px;"><span style="font-family:'Microsoft YaHei';font-size:14px;color:#ff6600;"><span style="color:#000000;"><span style="font-family:'Comic Sans MS';color:#FF6600;">name</span></span></span><span style="font-family:'Microsoft YaHei';font-size:14px;color:#ff6600;"><span style="color:#000000;"><span></span></span></span></span>和<span style="font-family:'Microsoft YaHei';font-size:14px;"><span style="font-family:'Microsoft YaHei';font-size:14px;color:#ff6600;"><span style="color:#000000;"><span style="font-family:'Comic Sans MS';color:#FF6600;">age</span></span></span><span style="font-family:'Microsoft YaHei';font-size:14px;color:#ff6600;"><span style="color:#000000;"><span></span></span></span></span>只是一个符号而已,并且它在由于它可能会在此类中重复出现多次,所以JVM把它当作常量来看待,将<span style="font-family:'Microsoft YaHei';font-size:14px;"><span style="font-family:'Microsoft YaHei';font-size:14px;color:#ff6600;"><span style="color:#000000;"><span style="font-family:'Comic Sans MS';color:#FF6600;">name</span></span></span><span style="font-family:'Microsoft YaHei';font-size:14px;color:#ff6600;"><span style="color:#000000;"><span></span></span></span></span>和<span style="font-family:'Microsoft YaHei';font-size:14px;"><span style="font-family:'Microsoft YaHei';font-size:14px;color:#ff6600;"><span style="color:#000000;"><span style="font-family:'Comic Sans MS';color:#FF6600;">age</span></span></span><span style="font-family:'Microsoft YaHei';font-size:14px;color:#ff6600;"><span style="color:#000000;"><span></span></span></span></span>以<span style="font-family:'Microsoft YaHei';font-size:14px;"><span style="font-family:'Microsoft YaHei';font-size:14px;color:#ff6600;"><span style="color:#000000;"><span style="color:rgb(255,102,0);"><span style="font-size:14px;"><span style="font-family:'Microsoft YaHei';"><span style="color:#000000;"><span style="font-family:'Microsoft YaHei';font-size:14px;"><span style="font-family:'Microsoft YaHei';font-size:14px;"><span style="font-family:'Comic Sans MS';">field</span></span></span></span></span></span></span></span></span></span>字段常量的形式保存到常量池中。</span></p> <p><br></p> <p><span style="font-family:'Microsoft YaHei';font-size:14px;"></span> </p> <p><span style="font-family:'Microsoft YaHei';font-size:14px;">将它<span style="font-family:'Microsoft YaHei';font-size:14px;"><span style="font-family:'Microsoft YaHei';font-size:14px;"><span style="font-family:'Microsoft YaHei';font-size:14px;color:#ff6600;"><span style="color:#000000;"><span style="font-family:'Comic Sans MS';color:#FF6600;">name</span></span></span></span></span>和<span style="font-family:'Microsoft YaHei';font-size:14px;"><span style="font-family:'Microsoft YaHei';font-size:14px;"><span style="font-family:'Microsoft YaHei';font-size:14px;color:#ff6600;"><span style="color:#000000;"><span style="font-family:'Comic Sans MS';color:#FF6600;">age</span></span></span></span></span>封装成<span style="font-family:'Comic Sans MS';color:#FF6600;"> CONSTANT_Fieldref_info</span> 常量池项,放到常量池中,在类中引用到它的地方,直接放置一个指向<span style="font-family:'Microsoft YaHei';font-size:14px;"><span style="font-family:'Microsoft YaHei';font-size:14px;"><span style="font-family:'Microsoft YaHei';font-size:14px;color:#ff6600;"><span style="color:#000000;"><span style="color:rgb(255,102,0);"><span style="font-size:14px;"><span style="font-family:'Microsoft YaHei';"><span style="color:#000000;"><span style="font-family:'Microsoft YaHei';font-size:14px;"><span style="font-family:'Microsoft YaHei';font-size:14px;"><span style="font-family:'Comic Sans MS';">field</span></span></span></span></span></span></span></span></span></span></span>字段所在常量池的索引。</span></p> <p><span style="font-family:'Microsoft YaHei';font-size:14px;">上面的<span style="font-family:'Comic Sans MS';color:#FF6600;">Person</span>类,使用<strong><span style="font-family:'Comic Sans MS';color:#FF6600;">javap -v Person</span></strong>指令,查看<span style="font-family:'Comic Sans MS';">class</span>文件的信息,你会看到,在<span style="font-family:'Microsoft YaHei';font-size:14px;"><span style="font-family:'Comic Sans MS';color:#FF6600;">Person</span></span>类中引用到<span style="font-family:'Microsoft YaHei';font-size:14px;"><span style="font-family:'Microsoft YaHei';font-size:14px;"><span style="font-family:'Microsoft YaHei';font-size:14px;"><span style="font-family:'Microsoft YaHei';font-size:14px;color:#ff6600;"><span style="color:#000000;"><span style="font-family:'Comic Sans MS';color:#FF6600;">age</span></span></span></span></span></span>和<span style="font-family:'Microsoft YaHei';font-size:14px;"><span style="font-family:'Microsoft YaHei';font-size:14px;"><span style="font-family:'Microsoft YaHei';font-size:14px;"><span style="font-family:'Microsoft YaHei';font-size:14px;color:#ff6600;"><span style="color:#000000;"><span style="font-family:'Comic Sans MS';color:#FF6600;">name</span></span></span></span></span></span><span style="font-family:'Microsoft YaHei';font-size:14px;"><span style="font-family:'Microsoft YaHei';font-size:14px;"><span style="font-family:'Microsoft YaHei';font-size:14px;"><span style="font-family:'Microsoft YaHei';font-size:14px;color:#ff6600;"><span style="color:#000000;"><span style="color:rgb(255,102,0);"><span style="font-size:14px;"><span style="font-family:'Microsoft YaHei';"><span style="color:#000000;"><span style="font-family:'Microsoft YaHei';font-size:14px;"><span style="font-family:'Microsoft YaHei';font-size:14px;"><span style="font-family:'Comic Sans MS';">field</span></span></span></span></span></span></span></span></span></span></span></span>字段的地方,都是指向了常量池中<span style="font-family:'Microsoft YaHei';font-size:14px;"><span style="font-family:'Microsoft YaHei';font-size:14px;"><span style="font-family:'Microsoft YaHei';font-size:14px;"><span style="font-family:'Microsoft YaHei';font-size:14px;"><span style="font-family:'Microsoft YaHei';font-size:14px;color:#ff6600;"><span style="color:#000000;"><span style="font-family:'Comic Sans MS';color:#FF6600;">age</span></span></span></span></span></span></span>和<span style="font-family:'Microsoft YaHei';font-size:14px;"><span style="font-family:'Microsoft YaHei';font-size:14px;"><span style="font-family:'Microsoft YaHei';font-size:14px;"><span style="font-family:'Microsoft YaHei';font-size:14px;color:#ff6600;"><span style="color:#000000;"><span style="font-family:'Comic Sans MS';color:#FF6600;">name</span></span></span></span></span></span><span style="font-family:'Microsoft YaHei';font-size:14px;"><span style="font-family:'Microsoft YaHei';font-size:14px;"><span style="font-family:'Microsoft YaHei';font-size:14px;"><span style="font-family:'Microsoft YaHei';font-size:14px;color:#ff6600;"><span style="color:#000000;"><span style="color:rgb(255,102,0);"><span style="font-size:14px;"><span style="font-family:'Microsoft YaHei';"><span style="color:#000000;"><span style="font-family:'Microsoft YaHei';font-size:14px;"><span style="font-family:'Microsoft YaHei';font-size:14px;"><span style="font-family:'Comic Sans MS';">field</span></span></span></span></span></span></span></span></span></span></span></span>字段对应的常量池项中。表示<span style="font-family:'Microsoft YaHei';font-size:14px;"><span style="font-family:'Microsoft YaHei';font-size:14px;"><span style="font-family:'Microsoft YaHei';font-size:14px;"><span style="font-family:'Microsoft YaHei';font-size:14px;color:#ff6600;"><span style="color:#000000;"><span style="color:rgb(255,102,0);"><span style="font-size:14px;"><span style="font-family:'Microsoft YaHei';"><span style="color:#000000;"><span style="font-family:'Microsoft YaHei';font-size:14px;"><span style="font-family:'Microsoft YaHei';font-size:14px;"><span style="font-family:'Comic Sans MS';">field</span></span></span></span></span></span></span></span></span></span></span></span>字段的常量池项叫做<span style="font-family:'Microsoft YaHei';font-size:14px;"><span style="font-family:'Comic Sans MS';color:#FF6600;">CONSTANT_Fieldref_info</span></span>。</span></p> <p><img alt="" src="https://img-blog.csdn.net/20141020172136250"></p> <fieldset><legend>怎样描述某一个field字段的引用?</legend> <p><img alt="" src="https://img-blog.csdn.net/20141021093513953"><br></p> </fieldset></blockquote> <p><span style="font-family:'Comic Sans MS';font-size:14px;color:#ff6600;"><img alt="" src="https://img-blog.csdn.net/20141021093957765"></span></p> <p><img alt="" src="https://img-blog.csdn.net/20141021094937961"></p> <p> </p> <p><span style="font-family:'Comic Sans MS';font-size:14px;color:#ff6600;"><img alt="" src="https://img-blog.csdn.net/20141021100345281"></span></p> <p><span style="color:rgb(255,102,0);font-family:'Comic Sans MS';"><span style="font-size:14px;"> <span style="font-family:'Microsoft YaHei';"> <span style="color:#000000;">实例解析: 现在,让我们来看一下<span style="color:#FF6600;"><strong><span style="font-family:'Comic Sans MS';">Person</span></strong></span>类中定义的<span style="font-family:'Comic Sans MS';color:#FF6600;">name</span><span style="font-family:'Comic Sans MS';">field</span>字段在常量池中的表示。通过使用<span style="font-family:'Microsoft YaHei';font-size:14px;"><strong><span style="font-family:'Comic Sans MS';color:#FF6600;">javap -v Person</span></strong></span>会查看到如下的常量池信息:</span></span></span></span></p> <p><span style="font-family:'Comic Sans MS';font-size:14px;color:#ff6600;"><img alt="" src="https://img-blog.csdn.net/20141021102039512"></span></p> <p><span style="font-family:'Comic Sans MS';font-size:14px;color:#ff6600;"><img src="https://img-blog.csdn.net/20141021141312817" alt=""></span></p> <p><span style="font-family:'Microsoft YaHei';font-size:14px;"> 请读者看上图中<span style="color:#3333FF;"><strong><span style="font-family:'Comic Sans MS';">name</span></strong></span><span style="font-family:'Comic Sans MS';">field</span>字段的数据类型,它在<strong><span style="color:#FF0000;">#6</span></strong>个常量池项,以UTF-8编码格式的字符串“<span style="font-family:'Comic Sans MS';"><strong>Ljava/lang/String;</strong></span>” 表示,这表示着这个<span style="font-family:'Microsoft YaHei';font-size:14px;"><span style="font-family:'Comic Sans MS';">field</span></span> 字段是<strong><span style="font-family:'Comic Sans MS';">java.lang.String</span></strong> 类型的。关于<span style="font-family:'Microsoft YaHei';font-size:14px;"><span style="font-family:'Microsoft YaHei';font-size:14px;"><span style="font-family:'Comic Sans MS';">field</span></span></span>字段的数据类型,<span style="font-family:'Comic Sans MS';">class</span>文件中存储的方式和我们在源码中声明的有些不一样。请看下图的对应关系:</span></p> <p><span style="font-family:'Comic Sans MS';font-size:14px;color:#ff6600;"><img src="https://img-blog.csdn.net/20141022140710727" alt=""><br></span></p> <p></p> <fieldset><legend><span style="font-family:'Microsoft YaHei';font-size:14px;color:#FF0000;"><strong>请注意!!!</strong></span></legend> <p> <span style="font-family:'Microsoft YaHei';font-size:14px;"> 如果我们在类中定义了field 字段,但是没有在类中的其他地方用到这些字段,它是不会被编译器放到常量池中的。读者可以自己试一下。(当然了,定义了但是没有在类中的其它地方引用到这种情况很少。)<strong><br></strong></span></p> <p><span style="font-family:'Microsoft YaHei';font-size:14px;"><strong>只有在类中的其他地方<span style="color:#FF0000;">引用</span>到了,才会将他放到常量池中</strong>。</span><br></p> </fieldset><p></p> <p><br></p> <span style="font-family:'Microsoft YaHei';"><span style="font-size:14px;"><strong></strong></span></span> <h4><span style="font-family:'Microsoft YaHei';"><span style="font-size:14px;"><span style="font-family:'Comic Sans MS';">NO10.</span><span style="font-family:'Microsoft YaHei';"><span style="font-size:14px;"><strong><span style="font-size:14px;"><span style="font-family:'Microsoft YaHei';"><strong>类中引用到的method方法</strong>在常量池中是怎样描述的?(<span style="font-size:14px;"><span style="font-family:'Comic Sans MS';color:#ff6600;">CONSTANT_Methodref_info</span><strong><span style="font-family:'Microsoft YaHei';">,</span></strong><span style="font-family:'Comic Sans MS';"> CONSTANT_Name_Type_info)</span></span></span></span></strong></span></span></span></span></h4> <p><strong> <span style="font-size:14px;"> </span><span style="font-family:'Microsoft YaHei';font-size:14px;">1.举例:</span></strong></p> <p> <span style="font-family:'Microsoft YaHei';font-size:12px;">还是以<strong><span style="font-family:'Comic Sans MS';">Person</span></strong>类为例。在<span style="font-family:'Microsoft YaHei';font-size:12px;"><strong><span style="font-family:'Comic Sans MS';">Person</span></strong></span>类中,我们定义了<strong><span style="font-family:'Comic Sans MS';">setName(String name)、getName()、setAge(int age)、getAge()</span></strong>这些方法: </span><br></p> <blockquote><pre><code class="language-java hljs"><ol class="hljs-ln"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-keyword">package</span> com.louis.jvm;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Person</span> </span>{</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="5"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">private</span> String name;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="6"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">private</span> <span class="hljs-keyword">int</span> age;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="7"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="8"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-function"><span class="hljs-keyword">public</span> String <span class="hljs-title">getName</span><span class="hljs-params">()</span> </span>{</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="9"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">return</span> name;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="10"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> }</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="11"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="12"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setName</span><span class="hljs-params">(String name)</span> </span>{</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="13"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">this</span>.name = name;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="14"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> }</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="15"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">int</span> <span class="hljs-title">getAge</span><span class="hljs-params">()</span> </span>{</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="16"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">return</span> age;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="17"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> }</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="18"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="19"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setAge</span><span class="hljs-params">(<span class="hljs-keyword">int</span> age)</span> </span>{</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="20"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">this</span>.age = age;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="21"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> }</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="22"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="23"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">}</div></div></li></ol></code><div class="hljs-button signin" data-title="登录后复制" onclick="hljs.signin(event)"></div></pre></blockquote> <span style="font-family:'Microsoft YaHei';font-size:12px;"><br></span> <blockquote><span style="font-family:'Microsoft YaHei';font-size:12px;"> 虽然我们定义了方法,但是这些方法没有在类总的其他地方被用到(即没有在类中其他的方法中引用到),所以它们的方法引用信息并不会放到常量中。<br></span> <p><span style="font-family:'Microsoft YaHei';font-size:12px;">现在我们在类中加一个方法<strong><span style="font-family:'Comic Sans MS';"> getInfo()</span></strong>,调用了<strong><span style="font-family:'Comic Sans MS';">getName()</span></strong>和<strong><span style="font-family:'Comic Sans MS';">getAge()</span></strong> 方法:</span></p> <pre><code class="language-java hljs"><ol class="hljs-ln"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-function"><span class="hljs-keyword">public</span> String <span class="hljs-title">getInfo</span><span class="hljs-params">()</span></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> {</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">return</span> getName()+<span class="hljs-string">"\t"</span>+getAge();</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="5"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> }</div></div></li></ol></code><div class="hljs-button signin" data-title="登录后复制" onclick="hljs.signin(event)"></div></pre><br><span style="font-family:'Microsoft YaHei';font-size:12px;">这时候<strong><span style="font-family:'Comic Sans MS';">JVM</span></strong>编译器会将<span style="font-family:'Microsoft YaHei';font-size:12px;"><strong><span style="font-family:'Comic Sans MS';">getName()</span></strong>和<strong><span style="font-family:'Comic Sans MS';">getAge()</span></strong></span>方法的引用信息包装成<span style="font-family:'Comic Sans MS';color:#FF0000;"><strong>CONSTANT_Methodref_info</strong></span>结构体放入到常量池之中。</span></blockquote> <p></p> <blockquote> <p><img src="https://img-blog.csdn.net/20141022155455316" alt=""><br></p> </blockquote> <blockquote> <p> <span style="font-family:'Microsoft YaHei';font-size:12px;">这里的方法调用的方式牵涉到Java非常重要的一个术语和机制,叫动态绑定。这个动态绑定问题以后在单独谈谈。</span></p> <p><span style="font-family:'Microsoft YaHei';font-size:12px;"> <br></span></p> </blockquote> <p><span style="font-family:'Microsoft YaHei';font-size:12px;"><strong><span style="font-size:14px;">2. 怎样表示一个方法引用?</span></strong><br></span></p> <blockquote> <p><span style="font-family:'Microsoft YaHei';font-size:12px;">请看下图:</span></p> </blockquote> <blockquote> <p><img src="https://img-blog.csdn.net/20141110150930996" alt=""></p> <p><img src="https://img-blog.csdn.net/20141111152543921" alt=""><br></p> </blockquote> <blockquote> <p><img src="https://img-blog.csdn.net/20141111130431203" alt=""><br></p> </blockquote> <p><strong><span style="font-family:'Microsoft YaHei';font-size:14px;">3. 方法描述符的组成</span></strong></p> <blockquote> <p><img src="https://img-blog.csdn.net/20141111125637625" alt=""><br></p> </blockquote> <blockquote> <p><img src="https://img-blog.csdn.net/20141111125836812" alt=""><br></p> </blockquote> <p><strong><span style="font-family:'Microsoft YaHei';font-size:14px;">4. <span style="font-family:'Comic Sans MS';"> getName() </span>方法引用在常量池中的表示</span></strong></p> <p><img src="https://img-blog.csdn.net/20141111132041264" alt=""><br></p> <p></p> <p><br></p> <h4><span style="font-family:'Microsoft YaHei';"><span style="font-size:14px;"><span style="font-family:'Comic Sans MS';">NO11.</span><span style="font-family:'Microsoft YaHei';"><span style="font-size:14px;"><strong><span style="font-size:14px;"><span style="font-family:'Microsoft YaHei';"><strong>类中引用到某个接口中定义的method方法</strong>在常量池中是怎样描述的?(<span style="font-size:14px;"><span style="font-family:'Comic Sans MS';color:#ff6600;">CONSTANT_InterfaceMethodref_info</span><strong><span style="font-family:'Microsoft YaHei';">,</span></strong><span style="font-family:'Comic Sans MS';"> CONSTANT_Name_Type_info)</span></span></span></span></strong></span></span></span></span></h4> <span style="font-family:'Microsoft YaHei';font-size:12px;">当我们在某个类中使用到了某个接口中的方法,JVM会将用到的接口中的方法信息方知道这个类的常量池中。</span> <p><span style="font-family:'Microsoft YaHei';font-size:12px;">比如我们定义了一个<strong><span style="font-family:'Comic Sans MS';">Worker</span></strong>接口,和一个<strong><span style="font-family:'Comic Sans MS';">Boss</span></strong>类,在<span style="font-family:'Microsoft YaHei';font-size:12px;"><strong><span style="font-family:'Comic Sans MS';">Boss</span></strong></span>类中调用了<span style="font-family:'Microsoft YaHei';font-size:12px;"><strong><span style="font-family:'Comic Sans MS';">Worker</span></strong></span>接口中的方法,这时候在<span style="font-family:'Microsoft YaHei';font-size:12px;"><span style="font-family:'Microsoft YaHei';font-size:12px;"><strong><span style="font-family:'Comic Sans MS';">Boss</span></strong></span></span>类的常量池中会有<span style="font-family:'Microsoft YaHei';font-size:12px;"><strong><span style="font-family:'Comic Sans MS';">Worker</span></strong></span>接口的方法的引用表示。</span></p> <p></p> <pre><code class="language-java hljs"><ol class="hljs-ln"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-keyword">package</span> com.louis.jvm;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-comment"><span class="hljs-comment">/**</span></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-comment"> * Worker 接口类</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="5"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-comment"> * <span class="hljs-doctag">@author</span> luan louis</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="6"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-comment"> */</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="7"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">interface</span> <span class="hljs-title">Worker</span></span>{</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="8"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="9"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">work</span><span class="hljs-params">()</span></span>;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="10"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="11"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">}</div></div></li></ol></code><div class="hljs-button signin" data-title="登录后复制" onclick="hljs.signin(event)"></div></pre><pre><code class="language-java hljs"><ol class="hljs-ln"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-keyword">package</span> com.louis.jvm;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-comment"><span class="hljs-comment">/**</span></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-comment"> * Boss 类,makeMoney()方法 调用Worker 接口的work</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="5"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-comment"> * <span class="hljs-doctag">@author</span> louluan</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="6"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-comment"> */</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="7"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Boss</span> </span>{</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="8"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="9"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">makeMoney</span><span class="hljs-params">(Worker worker)</span></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="10"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> {</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="11"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> worker.work();</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="12"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> }</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="13"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="14"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">}</div></div></li></ol></code><div class="hljs-button signin" data-title="登录后复制" onclick="hljs.signin(event)"></div></pre> <p></p> <p><span style="font-family:'Microsoft YaHei';font-size:12px;">我们对<span style="font-family:'Comic Sans MS';"><strong>Boss.class</strong></span>执行<span style="font-family:'Comic Sans MS';"><strong>javap -v Boss</strong></span>,然后会看到如下信息:</span></p> <p><img src="https://img-blog.csdn.net/20141111141834454" alt=""><br><br></p> <p><span style="font-family:'Microsoft YaHei';font-size:12px;">如上图所示,在<span style="font-family:'Microsoft YaHei';font-size:12px;"><span style="font-family:'Comic Sans MS';"><strong>Boss</strong></span></span>类的<strong><span style="font-family:'Comic Sans MS';">makeMoney()</span></strong>方法中调用了<span style="font-family:'Comic Sans MS';"><strong>Worker</strong></span>接口的<span style="font-family:'Comic Sans MS';"><strong>work()</strong></span>方法,机器指令是通过<span style="font-family:'Comic Sans MS';"><strong>invokeinterface</strong></span>指令完成的,<span style="font-family:'Microsoft YaHei';font-size:12px;"><span style="font-family:'Comic Sans MS';"><strong>invokeinterface</strong></span></span>指令后面的操作数,是指向了<span style="font-family:'Microsoft YaHei';font-size:12px;"><span style="font-family:'Microsoft YaHei';font-size:12px;"><span style="font-family:'Comic Sans MS';"><strong>Boss</strong></span></span></span>常量池中<span style="font-family:'Microsoft YaHei';font-size:12px;"><span style="font-family:'Comic Sans MS';"><strong>Worker</strong></span></span>接口的<span style="font-family:'Microsoft YaHei';font-size:12px;"><span style="font-family:'Comic Sans MS';"><strong>work()</strong></span></span>方法描述,表示的意思就是:“我要调用<span style="font-family:'Microsoft YaHei';font-size:12px;"><span style="font-family:'Comic Sans MS';"><strong>Worker</strong></span></span>接口的<span style="font-family:'Microsoft YaHei';font-size:12px;"><span style="font-family:'Comic Sans MS';"><strong>work()</strong></span></span>方法”。</span></p> <p><span style="font-family:'Microsoft YaHei';font-size:12px;"><span style="font-family:'Microsoft YaHei';font-size:12px;"><span style="font-family:'Comic Sans MS';"><strong>Worker</strong></span></span>接口的<span style="font-family:'Microsoft YaHei';font-size:12px;"><span style="font-family:'Microsoft YaHei';font-size:12px;"><span style="font-family:'Comic Sans MS';"><strong>work()</strong></span></span></span>方法引用信息,JVM会使用<span style="font-family:'Comic Sans MS';color:#FF0000;"><strong>CONSTANT_InterfaceMethodref_info</strong></span>结构体来描述,<span style="font-family:'Microsoft YaHei';font-size:12px;"><span style="font-family:'Comic Sans MS';color:#FF0000;"><strong>CONSTANT_InterfaceMethodref_info</strong></span></span>定义如下:</span></p> <p><img src="https://img-blog.csdn.net/20141111142916832" alt=""><br></p> <p><span style="font-size:12px;"> <span style="font-family:'Microsoft YaHei';"><span style="color:#FF0000;"><strong></strong></span></span><span style="font-family:'Microsoft YaHei';font-size:12px;"><span style="font-family:'Comic Sans MS';color:#FF0000;"><strong>CONSTANT_InterfaceMethodref_info</strong></span></span><span style="font-family:'Microsoft YaHei';">结构体和上面介绍的<span style="color:#FF0000;"><strong><span style="font-family:'Comic Sans MS';">CONSTANT_Methodref_info</span></strong></span> 结构体很基本上相同,它们的不同点只有:</span></span></p> <p><span style="font-family:'Microsoft YaHei';font-size:12px;"> 1.<span style="font-size:12px;"><span style="font-family:'Microsoft YaHei';font-size:12px;"><span style="font-family:'Comic Sans MS';color:#FF0000;"><strong>CONSTANT_InterfaceMethodref_info</strong></span></span></span> 的tag 值为11,而<span style="font-size:12px;"><span style="font-family:'Microsoft YaHei';"><span style="color:#FF0000;"><strong><span style="font-family:'Comic Sans MS';">CONSTANT_Methodref_info</span></strong></span></span></span>的tag值为10;</span></p> <p><span style="font-family:'Microsoft YaHei';font-size:12px;"> 2. <span style="font-size:12px;"> <span style="font-family:'Microsoft YaHei';font-size:12px;"><span style="font-family:'Comic Sans MS';color:#FF0000;"><strong>CONSTANT_InterfaceMethodref_info</strong></span></span></span> 描述的是接口中定义的方法,而<span style="font-size:12px;"><span style="font-family:'Microsoft YaHei';"><span style="color:#FF0000;"><strong><span style="font-family:'Comic Sans MS';">CONSTANT_Methodref_info</span></strong></span></span></span>描述的是实例类中的方法;</span></p> <p> </p> <fieldset><legend><span style="font-family:'Microsoft YaHei';">小试牛刀</span></legend> <p><span style="font-family:'Microsoft YaHei';">关于方法的描述,完全相同<span style="font-size:12px;"><span style="font-family:'Microsoft YaHei';font-size:12px;"><span style="font-family:'Comic Sans MS';color:#FF0000;"><strong>CONSTANT_InterfaceMethodref_info</strong></span></span></span>和上述的<span style="font-size:12px;"><span style="font-family:'Microsoft YaHei';"><span style="color:#FF0000;"><strong><span style="font-family:'Comic Sans MS';">CONSTANT_Methodref_info</span></strong></span></span></span> 结构体完全一致,这里就不单独为<span style="font-family:'Microsoft YaHei';"><span style="font-size:12px;"><span style="font-family:'Microsoft YaHei';font-size:12px;"><span style="font-family:'Comic Sans MS';color:#FF0000;"><strong>CONSTANT_InterfaceMethodref_info</strong></span></span></span></span>绘制结构图了,请读者依照<span style="font-size:12px;"><span style="font-family:'Microsoft YaHei';"><span style="color:#FF0000;"><strong><span style="font-family:'Comic Sans MS';">CONSTANT_Methodref_info</span></strong></span></span></span>的描述,结合本例子关于<span style="font-family:'Microsoft YaHei';font-size:12px;"><span style="font-family:'Comic Sans MS';"><strong>Worker</strong></span></span>接口和<span style="font-family:'Microsoft YaHei';font-size:12px;"><span style="font-family:'Microsoft YaHei';font-size:12px;"><span style="font-family:'Comic Sans MS';"><strong>Boss</strong></span></span></span>类的关系,使用javap -v Boss,查看常量池信息,然后根据常量池信息,自己动手绘制work() 方法在常量池中的结构。</span></p> </fieldset><br><p></p> <p> </p> <h4><span style="font-family:'Microsoft YaHei';"><span style="font-size:14px;"><span style="font-family:'Comic Sans MS';">NO12.</span><span style="font-family:'Microsoft YaHei';"><span style="font-size:14px;"><strong><span style="font-size:14px;"><span style="font-family:'Microsoft YaHei';"><span style="font-family:'Comic Sans MS';"></span><span style="font-size:14px;"><span style="font-family:'Comic Sans MS';"><span style="font-size:14px;"><span style="font-size:14px;">CONSTANT_MethodType_info</span></span><span>,<span style="font-size:14px;"><span style="font-size:14px;">CONSTANT_MethodHandle_info</span></span><span style="font-size:14px;"><span style="font-size:14px;"><span style="font-size:14px;"><span style="font-size:14px;">,CONSTANT_InvokeDynamic_info</span></span></span></span></span></span></span></span></span></strong></span></span></span></span></h4> <span style="font-family:'Microsoft YaHei';font-size:12px;"> 如果你从我的《常量池详解》<span style="font-family:'Comic Sans MS';"><strong>NO1</strong></span>节看到了<strong><span style="font-family:'Comic Sans MS';">NO11</span></strong>节,那么恭喜你,你已经学会了几乎所有的常量池项!只要你掌握了上述的常量池项,你就可以读懂你平常所见到的任何一个<strong><span style="font-family:'Comic Sans MS';">class</span></strong>文件的常量池了。</span> <p></p> <p><span style="font-family:'Microsoft YaHei';font-size:12px;"> 至于<strong><span style="font-family:'Comic Sans MS';">NO12</span></strong>所列出来的三项:<strong><span style="font-family:'Comic Sans MS';color:#CC0000;"><span style="font-size:14px;"><span style="font-size:14px;"></span></span>CONSTANT_MethodType_info,CONSTANT_MethodHandle_info,CONSTANT_InvokeDynamic_info</span></strong>,我想对你说,暂时先不管它吧。</span></p> <p><span style="font-family:'Microsoft YaHei';font-size:12px;"> 这三项主要是为了让Java语言支持动态语言特性而在Java 7 版本中新增的三个常量池项,只会在极其特别的情况能用到它,在class文件中几乎不会生成这三个常量池项。 其实我花了一些时间来研究这三项,并且想通过各种方式生成这三项,不过没有成功,最后搞的还是迷迷糊糊的。从我了解到的信息来看,Java 7对动态语言的支持很笨拙,并且当前没有什么应用价值,然后就对着三项的研究先放一放了。)</span></p> <p><span style="font-family:'Microsoft YaHei';font-size:12px;"> 如果读者有兴趣了解这三项,建议读者搜索关于<strong><em><u>Java 7 动态语言特性</u></em></strong>方面的文章,推荐阅读:<br></span></p> <p><span style="font-family:'Microsoft YaHei';font-size:12px;"> </span><span style="font-family:'Microsoft YaHei';font-size:12px;"><a rel="nofollow" data-token="18b687b2c5f7186e5e731abd98667004"> 探秘Java 7:JVM动态语言支持详解</a><br></span></p>