現在、ASM (Java バイトコード計測ライブラリ) を使用しています。特定のメソッドの署名を取得するために、「desc」という名前のフィールドがあります。これは「記述子」の略だと思いますが、なぜ「署名」と名付けられていないのでしょうか。「記述子」と「署名」に違いはありますか?
3 に答える
asm のコンテキストでは、内部名、メソッド記述子、型記述子、およびシグネチャが重要です。セクション番号はasm docからのものです。
2.1.2 内部名
「クラスの内部名は、ドットがスラッシュに置き換えられた、このクラスの完全修飾名です。」
com/snark/Boojum
2.1.3 型記述子
[[Ljava/lang/Object;
2.1.4 メソッド記述子
メソッド記述子は、メソッドのパラメーターの型と戻り値の型を 1 つの文字列で記述する型記述子のリストです。
int[] m(int i, String s) becomes (ILjava/lang/String;)[I
4.1. ジェネリック (署名用)
「下位互換性の理由から、ジェネリック型に関する情報は、型記述子またはメソッド記述子 (Java 5 でジェネリックが導入されるずっと前に定義されていた) には格納されませんが、型、メソッド、およびクラス シグネチャと呼ばれる同様の構造体に格納されます。」
この Java:
List<List<String>[]>
次の署名になります。
Ljava/util/List<[Ljava/util/List<Ljava/lang/String;>;>;
JVM 仕様のセクション 4.3.3 を見ると、記述子には戻り値の型が含まれていますが、これはメソッドのシグネチャの一部ではありません。
メソッド記述子は、メソッドが受け取るパラメーターとメソッドが返す値を表します
しかし...
名前と引数の型が同じである場合、2 つのメソッドは同じシグネチャを持ちます。
(これを考えると、記述子にメソッドの名前が含まれていることも明らかではありません...)
「記述子」はおそらく、JVM 仕様 § 4.3.3で定義されているメソッド記述子を指します。メソッドのパラメーターの型と戻り値の型について説明します。メソッド名は含まれません。
「署名」はおそらく、 Java 言語仕様 § 8.4.2で定義されている署名を指します。メソッドの名前とパラメーターの型が含まれています。戻り型は含まれません。
これら 2 つの用語は、2 つの異なる場所と異なるレベルで定義されていることに注意してください。メソッド記述子は JVM レベルに存在するため、Java言語とはかなり切り離されています。ただし、署名は非常によく似た概念ですが、Java言語レベル (JLS で定義されているとおり) で機能します。