<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="ja"> 
  <HEAD>
    <title>Akihito Nagata's Page</title> 
    <META http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
    <META http-equiv="Content-Style-Type" content="text/css">
    <meta name="keywords" content="akihito,nagata,ocaml,java,unix,linux,postgresql,html,stylesheet,cgi,thesis,type">
    <meta name="description" content="Akihito Nagata,プログラミングやlinuxなどのtips">    
    <meta name="robots" content="all">
    <link rel="stylesheet" href="/~ganat/stylesheet.css" type="text/css">
    
    <style type="text/css">
      
      div.java { padding : 20px;
      } 
      th.tag { background-color : eef;
      } 
      th.name { background-color : eef;
      }
      th.entry { background-color : eef;
      }

    td.entry { padding : 5px;}
      table.cpentry { margin-bottom : 20px;
                    }
    
    </style>
  </head>
  <body>
    <table summary="table" border=0 cellspacing=0 cellpadding=0>
	<tr>
	  <td valign="top">
	    <table summary="table" border=0 cellspacing=0 cellpadding=0>
		<tr>
		  <td>
		    <!-- 左上の画像 -->
		    <table summary="table" border=0 cellspacing=0 cellpadding=0>
			  <tr>
			    <td width=10><img alt="*" src="/~ganat/images/borders/pic_border_lt.jpg"></td>
			    <td width=120 style="background-image : url(/~ganat/images/borders/newpic_border_t.gif);">
			      <img alt="*" src="/~ganat/images/borders/white10x10.gif"></td>
			    <td witdh=10><img alt="*" src="/~ganat/images/borders/pic_border_rt.jpg"></td>
			  </tr>
			  <tr>
			    <td><img alt="*" src="/~ganat/images/borders/pic_border_l.jpg"></td>
			    <td><img alt="*" src="<!--#exec cgi="/~ganat/cgi-bin/todayimage.cgi"-->"></td>
			    <td style="background-image : url(/~ganat/images/borders/newpic_border_r.gif);vertical-align : top;">
			      <img alt="*" src="/~ganat/images/borders/white10x10.gif"></td>
			  </tr>
			  <tr>
			    <td><img alt="*" src="/~ganat/images/borders/pic_border_lb.jpg"></td>
			    <td style="background-image : url(/~ganat/images/borders/newpic_border_b.gif);text-align:left;">
			      <img alt="*" src="/~ganat/images/borders/white10x10.gif"></td>
			    <td><img alt="*" src="/~ganat/images/borders/newpic_border_rb.gif"></td>
			  </tr>
		      </table>
		  </td>
		</tr>
		<tr>
		  <td class="menu" valign="top">
		    <!-- MENU -->
		    <div class="menutitle"><img alt="menu" src="/~ganat/images/menutitle.jpg"></div>
		    <div class="menu"><table width="140">
<tr style="text-align : right; "><td><a class="menu" href="/~ganat/index.html">Top Page</a></td></tr>
<tr style="text-align : right; "><td><a class="menu" href="/~ganat/ocaml/ocaml.html">Ocaml</a></td></tr>
<tr style="text-align : right; "><td><a class="menu" href="/~ganat/java/java.html">Java</a></td></tr>
<tr style="text-align : right; "><td><a class="menu" href="/~ganat/diary.html">Theses</a></td></tr>
<tr style="text-align : right; "><td><a class="menu" href="/~ganat/presentation.html">Presentation</a></td></tr>
<tr style="text-align : right; "><td><a class="menu" href="/~ganat/survey/index.html">Survey</a></td></tr>
<tr style="text-align : right; "><td><a class="menu" href="/~ganat/unix/unix.html">Unix Tips</a></td></tr>
<tr style="text-align : right; "><td><a class="menu" href="/~ganat/memo/index.html">Memo</a></td></tr>
<tr style="text-align : right; "><td><a class="menu" href="/~ganat/link.html">LINK</a></td></tr>
<tr style="text-align : right; "><td><a class="menu" href="/~ganat/cgi-bin/nagabbs/nagabbs.cgi">BBS</a></td></tr>
</table>
</div>
		  </td>
		</tr>
	    </table>
	  </td>
	  <td>
      <table summary="table" border=0 cellspacing=0 cellpadding=0>
		<tr>
		  <td valign="top" style="text-align : center;">
		    <!-- 題名 -->
		    <!-- <div class="title">GANAT PAGE</div> -->
		    <img alt="Akihito Nagata's Page" src="/~ganat/images/title.gif">
		  </td>
		</tr>
		<tr>
		  <td>
		    <!-- メイン -->
		    <table summary="table" border=0 cellspacing=0 cellpadding=0>
			<tr>
			  <td width="10"><img alt="|" src="/~ganat/images/borders/vline_t.jpg"></td>
			  <td></td>
			  <td></td>
			</tr>
			<tr>
			  <td style="background-image:url(/~ganat/images/borders/vline.jpg);"><img alt="|" src="/~ganat/images/borders/vline.jpg"></td>
			  <td><div class="main"> 
    <div class="title"><span class="title">その3：コンスタントプール</span><img alt="coffee" src="/~ganat/images/coffee.gif"></div>
    <div class="java"> 
      9バイト目からコンスタントプールが始まります。コンスタントプールは簡単に言えばコード中に現れる定数がまとめて入っています。定数と言ってもintやdoubleだけではなく、文字列やメソッドの情報なども入っています。ここからはかなりややこしいです。
      <h4>９〜１０バイト:コンスタントプールエントリ</h4>
      ２バイトを使ってコンスタントプールに入っているエントリ数が記述してあります。
      <h4>１１バイト〜:コンスタントプールエントリ配列</h4>
      ここからコンスタントプールの中身が始まります。定数の種類はいろいろあり、種類によってクラスファイルの中身を占めるバイト数が異なります。<br>
      各エントリは1バイトのタグから始まり、そのタグの値によって中身のデータの使い方がわかります。<br>
      以下にタグの値とエントリの内容の説明をします。
      <table class="cpentry" border="1">
	  <tr><th class="tag">タグの値</th><td>1</td></tr>
	  <tr><th class="name">エントリ名</th><td>CONSTANT_Utf8_info</td></tr>
	  <tr>
	    <th class="entry">エントリの内容</th>
	    <td class="entry">
	      <table border="1">
		  <tr><th>バイト数</th><th></th></tr>
		  <tr><td>2</td><td>バイト長、文字列データの長さ</td></tr>
		  <tr><td>可変</td><td>文字列データ</td></tr>
	      </table>
	      文字列データが入っていると言ってもStringリテラルではない。ここには文字列データをUtf８形式で保存してある。Utf８形式は日本語は３バイトに変換されるが、英数は1バイトに変換されるので英数を格納するときは全ての文字が２バイトになるUnicodeで格納するよりも効率がよい。
	    </td>
	  </tr>
      </table>
      <table class="cpentry" border="1">
	  <tr><th class="tag">タグの値</th><td>3</td></tr>
	  <tr><th class="name">エントリ名</th><td>CONSTANT_Integer_info</td></tr>
	  <tr>
	    <th class="entry">エントリの内容</th>
	    <td class="entry">
	      <table border="1">
		  <tr><th>バイト数</th><th></th></tr>
		  <tr><td>4</td><td>int型の値</td></tr>
	      </table>
	      整数(int型)の値が入る。格納形式はビッグエンディアン。
	    </td>
	  </tr>
      </table>

      <table class="cpentry" border="1">
	  <tr><th class="tag">タグの値</th><td>4</td></tr>
	  <tr><th class="name">エントリ名</th><td>CONSTANT_Float_info</td></tr>
	  <tr>
	    <th class="entry">エントリの内容</th>
	    <td class="entry">
	      <table border="1">
		  <tr><th>バイト数</th><th></th></tr>
		  <tr><td>4</td><td>float型の値</td></tr>
	      </table>
	      浮動小数点数(float型)の値が入る。格納形式はビッグエンディアン。
	    </td>
	  </tr>
      </table>

      
      <table class="cpentry" border="1">
	  <tr><th class="tag">タグの値</th><td>5</td></tr>
	  <tr><th class="name">エントリ名</th><td>CONSTANT_Long_info</td></tr>
	  <tr>
	    <th class="entry">エントリの内容</th>
	    <td class="entry">
	      <table border="1">
		  <tr><th>バイト数</th><th></th></tr>
		  <tr><td>8</td><td>long型の値</td></tr>
	      </table>
	      整数(long型)の値が入る。格納形式はビッグエンディアン。
	    </td>
	  </tr>
      </table>

      <table class="cpentry" border="1">
	  <tr><th class="tag">タグの値</th><td>6</td></tr>
	  <tr><th class="name">エントリ名</th><td>CONSTANT_Double_info</td></tr>
	  <tr>
	    <th class="entry">エントリの内容</th>
	    <td class="entry">
	      <table border="1">
		  <tr><th>バイト数</th><th></th></tr>
		  <tr><td>8</td><td>double型の値</td></tr>
	      </table>
	      浮動小数点数(double型)の値が入る。格納形式はビッグエンディアン。
	    </td>
	  </tr>
      </table>

      <table class="cpentry" border="1">
	  <tr><th class="tag">タグの値</th><td>7</td></tr>
	  <tr><th class="name">エントリ名</th><td>CONSTANT_Class_info</td></tr>
	  <tr>
	    <th class="entry">エントリの内容</th>
	    <td class="entry">
	      <table border="1">
		  <tr><th>バイト数</th><th></th></tr>
		  <tr><td>2</td><td>CONSTANT_Utf8のエントリのindex</td></tr>
	      </table>
	      クラス、インターフェースへの参照を格納するエントリ。しかし、クラスそのものが入るのではなくクラスの情報を示す文字列が格納してあるCONSTANT_Utf8のエントリを指す。
	    </td>
	  </tr>
      </table>

      <table class="cpentry" border="1">
	  <tr><th class="tag">タグの値</th><td>8</td></tr>
	  <tr><th class="name">エントリ名</th><td>CONSTANT_String_info</td></tr>
	  <tr>
	    <th class="entry">エントリの内容</th>
	    <td class="entry">
	      <table border="1">
		  <tr><th>バイト数</th><th></th></tr>
		  <tr><td>2</td><td>CONSTANT_Utf8のエントリのindex</td></tr>
	      </table>
	      Stringへの参照を格納するエントリ。しかしStringそのものが入るのではなく,Stringの情報を示す文字列が格納してあるCONSTANT_Utf8のエントリを指す。
	    </td>
	  </tr>
      </table>

      <table class="cpentry" border="1">
	  <tr><th class="tag">タグの値</th><td>9</td></tr>
	  <tr><th class="name">エントリ名</th><td>CONSTANT_Fieldref_info</td></tr>
	  <tr>
	    <th class="entry">エントリの内容</th>
	    <td class="entry">
	      <table border="1">
		  <tr><th>バイト数</th><th></th></tr>
		  <tr><td>2</td><td>class_index.フィールドの所属するクラスの情報を持つCONSTANT_Class_infoのエントリへのindex</td></tr>
		  <tr><td>2</td><td>name_and_type_index.フィールドの名前とフィールドのディスクリプタの情報を持つCONSTANT_NameAndType_infoのエントリへのindex.</td></tr>
		  フィールドへの参照を格納してある。フィールドそのものは格納しておらず、情報への参照が格納してある。
	      </table>
	    </td>
	  </tr>
      </table>
      <table class="cpentry" border="1">
	  <tr><th class="tag">タグの値</th><td>10</td></tr>
	  <tr><th class="name">エントリ名</th><td>Constant_Methodref_info</td></tr>
	  <tr>
	    <th class="entry">エントリの内容</th>
	    <td class="entry">
	      <table border="1">
		  <tr><th>バイト数</th><th></th></tr>
		  <tr><td>2</td><td>このメソッドを所有するクラスの情報を持つCONSTANT_Class_infoエントリへのindex</td></tr>
		  <tr><td>2</td><td>このメソッドの名前とディスクリプタをまとめたCONSTANT_NameAndType_infoへのindex</td></tr>
	      </table>
	      インタフェースではないメソッドの参照
	    </td>
	  </tr>
      </table>
      <table class="cpentry" border="1">
	  <tr><th class="tag">タグの値</th><td>11</td></tr>
	  <tr><th class="name">エントリ名</th><td>CONSTANT_INterfaceMethodref_info</td></tr>
	  <tr>
	    <th class="entry">エントリの内容</th>
	    <td class="entry">
	      <table border="1">
		  <tr><th>バイト数</th><th></th></tr>
		  <tr><td>2</td><td>このメソッドを持つCONSTANT_Class_infoへのindex.</td></tr>
		  <tr><td>2</td><td>このメソッドの名前とディスクリプタを持つCONSTANT_NameAndType_infoへのindex</td></tr>
	      </table>
	      インタフェースが持っているメソッドの情報

	    </td>
	  </tr>
      </table>
      <table class="cpentry" border="1">
	  <tr><th class="tag">タグの値</th><td>12</td></tr>
	  <tr><th class="name">エントリ名</th><td>CONSTANT_NameAndType_info</td></tr>
	  <tr>
	    <th class="entry">エントリの内容</th>
	    <td class="entry">
	      <table border="1">
		  <tr><th>バイト数</th><th></th></tr>
		  <tr><td>2</td><td>フィールド名もしくはメソッドの名を持つCONSTANT_Utf8エントリのindex</td></tr>
		  <tr><td>2</td><td>フィールドもしくはメソッドのディスクリプタを持つCONSTANT_Utf8エントリへのindex.</td></tr>
	      </table>
	    </td>
	  </tr>
      </table>


    </div>
  </div></td>
			  <td></td>
			</tr>
			<tr>
			  <td><img alt="|" src="/~ganat/images/borders/vline_b.jpg"></td>
			  <td></td>
			  <td></td>
			</tr>
		    </table>
		  </td>
		</tr>
	    </table>
    </td>
  </tr>
  </table>
    <div><a href="/~ganat/old/index.html">前のページはこちら</a></div>
  </body> 
</html>