回答編集履歴
3
表現の正確さ向上のため修正。
test
CHANGED
@@ -18,7 +18,15 @@
|
|
18
18
|
|
19
19
|
|
20
20
|
|
21
|
-
インターフェースはクラスと見做さない場合には、そのファイルを byte stream として読み込んで、[クラスファイルの構造定義](https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.1)に従って内容を解析する必要があります。その構造の中の this_class という項目に入っているインデックス値で、constant_pool というテーブル構造の中のインデックス位置にある COSTANT_Class_info 構造に記された name_index の値がまた constant_pool 構造内のインデックス値であり、それが指す、CONSTANT_Utf8_info 構造が保持する byte配列をutf-8エンコーディングされているものとして文字列変換することでクラス名が得られます。
|
21
|
+
インターフェースはクラスと見做さない場合には、そのファイルを byte stream として読み込んで、[クラスファイルの構造定義](https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.1)に従って内容を解析する必要があります。その構造の中の this_class という項目に入っているインデックス値で、constant_pool というテーブル構造の中のインデックス位置にある COSTANT_Class_info 構造に記された name_index の値がまた constant_pool 構造内のインデックス値であり、それが指す、CONSTANT_Utf8_info 構造が保持する byte配列をutf-8エンコーディングされているものとして文字列変換することでクラス名が得られます。
|
22
|
+
|
23
|
+
これだけだとインターフェースも含んでしまうため、インターフェースではないことを特定するために access_flags 構造を参照して、その構造の ACC_INTERFACE を表すビットがオフであることを確かめます。もっとも、この情報はクラスファイルの構造上、this_classの直前にあるので、先に判定すればクラス名を得るための処理は必要な時だけ行えるでしょう。
|
24
|
+
|
25
|
+
|
26
|
+
|
27
|
+
端折って書くなら、constant_pool 構造の解析中に、COSTANT_Class_infoが登場したら控えておいて、のちに access_flags の状態でクラス名を特定してしまうこともできるでしょう。
|
28
|
+
|
29
|
+
ただ、この中で骨が折れるのは constant_pool が配列のように定義されて見えるものの、各要素の構造は一定ではなく、先頭の決まった位置にある長さ情報を見ながら、その先の構造を探し出す必要があることです。
|
22
30
|
|
23
31
|
|
24
32
|
|
2
ゴミ削除
test
CHANGED
@@ -6,7 +6,7 @@
|
|
6
6
|
|
7
7
|
|
8
8
|
|
9
|
-
ソースファイルを意味しているのであれば、ソースファイル中をJavaの文法に従って構文解析するロジックを書くことになります。その上でクラス定義している箇所から名前を取り出すようにしなければなりません。
|
9
|
+
ソースファイルを意味しているのであれば、ソースファイル中をJavaの文法に従って構文解析するロジックを書くことになります。その上でクラス定義している箇所から名前を取り出すようにしなければなりません。
|
10
10
|
|
11
11
|
その理由はコメント内や定数定義された中の文字列を除外する必要があるからです。様々なソースファイルの書き方を考慮すると単純な文字列検索では、不適切な場所の文字列も検索結果に含まれるからです。また、コメントを除外するのも、コーディングの書き方によって、単純なロジックで処理するのは正確には行えないでしょう。コメントの記述の書式、例えば // の右側をコメントにしようとした時に、その // が文字列定数の中の場合、その右側全部をコメントとしてしまうのは誤った結果につながります。
|
12
12
|
|
1
マークダウンの誤記修正。
test
CHANGED
@@ -1,4 +1,6 @@
|
|
1
1
|
> javaファイル
|
2
|
+
|
3
|
+
|
2
4
|
|
3
5
|
これが、ソースファイルを指すのか、コンパイル後の拡張子が .class のファイルを指すのかによって、方法は大きく変わります。
|
4
6
|
|