web-dev-qa-db-ja.com

Java関数のシグネチャを計算する

計算 a Javaクラスのメソッドのシグネチャ)に署名する方法はありますか?
like ([Ljava/lang/String;)Vは、String[]を引数として取る関数を表します
そしてvoidを返します。

署名を計算するためのルールは何ですか?

28
Niklas R

これは常に、引数の型シニフィアンをコンマなどなしで次々に囲む括弧のセットであり、その後に閉じ親の後の戻り値の型シニフィアンが続きます。それはかなり簡単です。

このページ: に型シグネチャの表があります

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したい場合は、十分に単純です。上記の表を、オブジェクトと配列を処理するためのルールとともに使用してください。

41

javap -s <class-name>ファイルを含むフォルダーで.classを実行するだけです。 100%の精度で教えてくれます。これらのことを推測する必要はありません。

9
asloob

クイックグーグル検索はこのウェブページを発見しました:

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        [ 
4
Jason S

詳細については、 ここ を参照してください。

基本的にはparamsで、次に戻り値です。

1
Dave Newton

から 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仮パラメータの数とタイプメソッド

1
Matt Ball

この情報は Java仮想マシン仕様 にあります。

1
Mark Rotteveel