計算 a Javaクラスのメソッドのシグネチャ)に署名する方法はありますか?
like ([Ljava/lang/String;)V
は、String[]
を引数として取る関数を表します
そしてvoid
を返します。
署名を計算するためのルールは何ですか?
これは常に、引数の型シニフィアンをコンマなどなしで次々に囲む括弧のセットであり、その後に閉じ親の後の戻り値の型シニフィアンが続きます。それはかなり簡単です。
このページ: に型シグネチャの表があります
Signature Java Type
Z boolean
B byte
C char
S short
I int
J long
F float
D double
V void
L fully-qualified-class ; fully-qualified-class
[ type type[]
これらの最後の2つは、クラスに名前を付けるには、たとえばLjava/lang/Object;
と言い、(たとえば)int
の配列に名前を付けるには、[I
と配列を言うことを意味します。 int
の配列のは[[I
です。
リフレクションに基づくJavaコード)の署名を文字通りcomputeしたい場合は、十分に単純です。上記の表を、オブジェクトと配列を処理するためのルールとともに使用してください。
javap -s <class-name>
ファイルを含むフォルダーで.class
を実行するだけです。 100%の精度で教えてくれます。これらのことを推測する必要はありません。
クイックグーグル検索はこのウェブページを発見しました:
http://www.rgagnon.com/javadetails/Java-0286.html
署名には2つの部分があります。最初の部分は括弧で囲まれ、メソッドの引数を表します。 2番目の部分は閉じ括弧の後に続き、戻り値の型を表します。 Java型とC型の間のマッピングは
Type Chararacter boolean Z byte B char C double D float F int I long J object L short S void V array [
詳細については、 ここ を参照してください。
基本的にはparamsで、次に戻り値です。
から JLS、§8.4.2 :
8.4.2メソッドシグネチャ
メソッドのsignatureは、メソッドの名前と、メソッドの仮パラメーターの数とタイプで構成されます。クラスが同じシグニチャを持つ2つのメソッドを宣言しない場合、またはコンパイル時エラーが発生する場合があります。
例:
class Point implements Move { int x, y; abstract void move(int dx, int dy); void move(int dx, int dy) { x += dx; y += dy; } }
同じシグネチャを持つ2つの
move
メソッドを宣言しているため、コンパイル時エラーが発生します。宣言の1つがabstract
であっても、これはエラーです。
つまり、「ルール」は
メソッドのnameと仮パラメータの数とタイプメソッド
この情報は Java仮想マシン仕様 にあります。