Java classファイルフォーマットの特殊文字列_動力ノードJava学院の整理


クラスファイルの特殊文字列
まず説明します。特殊文字列というのはクラスファイルの常量池に現れて、順を追って漸進してスパンを減らすという原則に基づいて、まずクラスファイルの中の特殊文字列を詳しく紹介してから、振り返って常量池を説明します。 今は特別な文字列に重点を置いています。特殊な文字列には、クラスの全制限命名、フィールドと方法の記述子、特殊な方法の方法名があります。この三つの特殊文字列を紹介します。
(1)類の全制限命名
常量池では、一つのタイプの名前は私たちがソースファイルで見たのではなく、ソースファイルで使用しているパッケージ名とクラス名の形式でもありません。ソースファイルのフルネームとクラスファイルのフルネームは同じ概念ではありません。ソースファイルの新しい名前は、パケット名とクラス名、パッケージ名の各部分の間に、パケット名とクラス名の間に、ポイント番号を使って分割されます。Object類のように、ソースファイルのフルネームはjava.lang.Objectです。クラスファイルのフルネームは、ポイント番号を「/」に変更します。例えば、Object類のclassファイルでのフルネームはjava/lang/Objectです。もし読者が以前にclassファイルのフォーマットに接触したことがないならば、classファイルのフォーマットの初心者で、ここで全制限の名前がclassファイルの中でどのように使うのかを知らないでください。 
(2)ディスクリプタ
一つのクラスではいくつかのフィールドと方法があり得ることを知っています。これらのフィールドと方法はソースファイルでどのように表現されていますか?今からクラスのファイルフォーマットを勉強したいですが、一つのフィールドまたは一つの方法はクラスファイルでどう表現されていますか?本論文では、方法とフィールドのclassファイルにおける記述について議論する。方法とフィールドの記述子は、方法とフィールドのすべての情報を記述しません。つまり、記述子は単純な文字列です。 
ディスクリプタを説明する前に、まず問題を説明します。それはすべてのタイプが記述子に対応する文字や文字列を持っています。例えば、基本データの種類ごとに大文字で対応しています。voidも大文字で対応しています。下表は、voidと基本データタイプのディスクリプタでの対応です。
基本データタイプとvoidタイプ
タイプの対応文字
byte
B
char
C
ドビー
D
float
F
要点
I
long
J
ショート?ト
S
bollan
Z
void
V
基本的にはタイプの頭文字が大文字になって対応していますが、ここではlongとbollanは特殊な例であり、longタイプの記述子の対応する文字はJであり、bollanタイプの記述子の中の対応する文字はZであります。 
基本タイプとvoidはどちらも大文字で対応していますが、引用タイプ(クラスとインターフェース、エニュメレーション)は説明符でどのように対応していますか?参照の種類に対応する文字列(参照の種類は記述子に文字列を使って対応します。)
1.「L」 + タイプのフルネーム + “;”  
なお、この3つの部分の間にはスペースがなく、緊密に配列されている。Objectのような記述子の対応する文字列は、Ljava/lang/Objectです。 ; ArayListの記述子における対応文字列は、Ljava/lang/ArayListである。 ; カスタムタイプcomp.example.Personの記述子における対応文字列は、Lcom/example/Personである。
私たちは、Java言語における配列も一種のタイプであり、配列の要素タイプと彼の次元が彼のタイプを決定していることを知っています。例えば、int[]a宣言では変数aの種類はint[],int[]b宣言では変数bの種類はint[]、[]であり、Object[]c声明では変数cの種類はObject[]である。配列がタイプである以上、記述子にも配列タイプの対応する文字列があるべきである。classファイルの記述子では、配列の種類ごとに1つの「代表、配列タイプ全体の対応する文字列の書式は以下の通りです。
1.いくつかの[]  +  配列内の要素タイプの対応する文字列   
以下に名前を挙げます。 int[]タイプの対応文字列は、[I] 。 int[][]タイプの対応文字列は[[I]です。 Object[]タイプの対応文字列は、「Ljava/lang/Object」です。 Object[][]タイプの対応文字列は[[Ljava/lang/Object]です。
各タイプの記述子の対応する文字列を紹介しました。フィールドと方法の説明を始めます。 
フィールドの記述子は、フィールドの種類に対応する文字または文字列です。フィールドiの記述子はIである。Object oでは、フィールドoの記述子はLjava/lang/Objectです。 。 double[][]dのフィールドdの記述子は[D]です。 
方法の記述子は、すべてのパラメータの種類のリストと方法の戻り値を含む複雑である。フォーマットはこのようです。
1.(パラメータ1タイプ パラメータ2タイプ パラメータ3タイプ ...)戻り値の種類  
ここでは、パラメータの種類であれ、戻り値の種類であれ、対応する文字と対応する文字列を用いて表され、パラメータリストは括弧で囲まれており、各パラメータタイプの間にはスペースがなく、パラメータリストと戻り値タイプの間にもスペースがない。 
以下の例を挙げて説明します。この表は「Java仮想マシンに深く入る」から来ています。
メソッド記述子
メソッド宣言
()I
int get Size()
()Ljava/lang/String
String toString()
([Ljava/lang/String;)V
void main(String[]args)
()V
void wait()
(JI)V
void wait(long timeout,int nanos)
(ZILjava/lang/String;II)Z
bootlean regionMatch(bolean ignoreCase,int toOffset,String other,int ooffset,int len)
([BII]I
int read(byte[]b,int off,int len)
()[[Ljava/lang/Object]
Object[]getObject Aray()
(3)特殊方法の方法名
まず、ここの特殊な方法はクラスの構造方法とタイプ初期化方法を指します。构造方法はもちろん、初期化のタイプについては、ソースの対応は、静的な初期化ブロックです。すなわち、静的初期化ブロックは、クラスファイルにおいて一つの方法で表現されており、この方法は同様に方法記述子と方法名を有する。 
クラスの構成方法の方法名は文字列で表しますが、静的な初期化方法の方法名は文字列を使います。 を表示しますこの2つの特殊な方法を除いて、他の一般的な方法の方法名はソースファイルの方法名と同じです。
締め括りをつける
クラスファイル中の特殊文字列は、クラス(インターフェース、列挙を含む)の全制限された名前、フィールドの記述子および方法の記述子を含む。クラスの全制限された名前は、各タイプのマッピングに関連しているので、フィールドと方法の記述子が分かりやすいです。やや複雑かもしれません。記述子を理解するには、各タイプ(8つの基本データタイプ、クラスタイプ、配列タイプ、およびvoidを含む)の記述子に対応する記述文字または文字列を熟記することが主である。 
もう一つの注意が必要です。方法とフィールドの記述子にはフィールド名と方法名が含まれておらず、フィールド記述子にはフィールドタイプのみが含まれています。方法記述子にはパラメータリストと戻り値タイプのみが含まれています。