序文
誰もがJava8を使用すると、特定のパラメーター情報を表すために対応するメソッド署名に新しいオブジェクトパラメーターが追加されていることを知っています。対応するパラメーター名は、getNameを使用して取得できます。つまり、ユーザー名などのコードに書かれているように、前景にパラメーターを渡すときに、@parameter( "username")クラスなどの注釈を書く必要はありませんが、名前で直接マッピングできます。
次のコード参照が示されています。
public class t {private interface t2 {void method(string username、string password); } public static void main(string [] args)throws exception {system.out.println(t.class.getMethod( "main"、string []。class).getParameters()[0] .getName()); system.out.println(t2.class.getMethod( "method"、string.class、string.class).getParameters()[0] .getName()); System.out.println(t2.class.getMethod( "method"、string.class、string.class).getParameters()[1] .getName()); }} Java8の前に、何らかの手段でパラメーター名情報を取得することもできますが、メソッドは異なります。たとえば、Spring MVCのParameterMethodNameResolver 、以前のバージョンでも正常に機能する可能性があります。ただし、特別な編集のみが必要です。ここで機能するのは、ローカル変数のテーブルと中国語のメソッドパラメーターテーブルにコンパイルされているLocalVariableTableとMethodParametersです。
LocalVariabletableローカル変数テーブル
JVM仕様によれば、ローカル変数テーブルはコード属性に存在し、コード属性もMethodInfoの属性です。メソッドにメソッド本体がある場合、対応するコード属性が表示されることが理解できます。コード属性には、特定のコード実行に加えて、他の情報があります。たとえば、Linenumbertable(コードの各行の場所を説明するために使用)。
ローカル変数テーブルはメソッドのデバッグ情報の一部であるため、デフォルトではこの情報はクラスファイルで生成されません。 -gまたは-g:varsスイッチをオンにする必要があります。幸いなことに、IDEまたはMavenコンピレーションの場合、これらのスイッチはデフォルトでオンになります。 IDEでは、設定して制御できます(IDEAのデバッグ情報を生成)(デフォルトチェック)。 Mavenでは、出力がプラグインMaven-Compiler-Pluginのデバッグまたはデバッグレベルによって制御されるかどうか(デフォルト値は真)。
ローカル変数テーブルは、次のようにJavapの後です。
//非静的方法localvariabletable:開始長スロット名署名0 1 0このlt; 0 1 1カウントJ 0 1 3名前ljava/lang/string; // staticメソッドlocalvariabletable:開始長スロット名署名0 101 0 args [ljava/lang/string;
ローカル変数テーブルは、パラメーター情報を保存するだけでなく、宣言されたINT Iなど、メソッドボディ全体で使用できる一時的な変数も保存します。上記のように、メソッドと非静的な方法は、この変数間に最初の位置に違いがあります。したがって、パラメーターの数( method.getParameterCount )を読み取り、メソッドの署名に従ってローカル変数テーブルの指定された番号のパラメーター情報を読み取ることができます。
上記の図では、パラメーターが長いか二重の場合、そのスロットは2つの場所を占めることに注意する必要があります。スロットを介してパラメーター情報を取得する場合、パラメータータイプ情報を考慮する必要があります。
インターフェイスメソッドにはコード属性がないため、ローカル変数テーブルはありません。インターフェイスのメソッド定義を取得した場合、ローカル変数テーブルを介して対応するパラメーター名を取得することはできません。
MethodParametersメソッドパラメーターテーブル
メソッドパラメーターテーブルは1.8以降に導入されたため、この情報はJDK8でコンパイルされたクラスファイルでのみ使用できます。ローカル変数テーブルとは異なり、MethodInfo属性に属します。つまり、コード属性と同じレベルです。インターフェイスメソッドであろうと通常の方法であろうと、この属性があります。したがって、インターフェイスメソッドでさえ、対応するパラメーター情報を取得できます。
デフォルトでは、この情報はクラスでは利用できません。生成するには特別なコンパイルパラメーター-parametersが必要であり、この情報はIdeaとMavenでデフォルトで生成されません。アイデアでは、このコンパイルパラメーターをJava追加ラインパラメーターに追加する必要があります。 Mavenでは、このパラメーターをMaven-Compiler-PluginのcompilerArgsパラメーターに追加する必要があります。
メソッドパラメーターテーブルは、Javapの後に次の形式に表示されます。
//非静的メソッドMethodParameters:名前フラグ数名//静的メソッドMethodParameters:名前フラグargs
静的かどうかにかかわらず、パラメーターを説明するために使用される情報のみがパラメーターテーブルに表示されることがわかります。次のフラグパラメーターは、メソッド書き換えなどのfinalパラメーターなど、いくつかの特別なシナリオで使用されます。
いくつかのツールが利用可能です
ネイティブAPIおよびスプリングツールキットの使用に加えて、パラメーター名情報を取得できる他のツールがあります。 Springシステムでは、パラメーター名を記述するために使用されるインターフェイスは、 ParameterNameDiscovererです。それを通して、対応するパラメーター名情報を取得できます。さらに、 com.thoughtworks.paranamer:paranamer Toolkitも対応する情報を処理できます。ただし、JDK8 MethodParametersのサポートはそれほど高くなく、ユーザーはそれを拡張することで独自の目標を達成できます。
要約します
上記は、あなたが要約したJavaコードのパラメーター名情報を取得する方法です。 Javaの学習や使用に役立つことを願っています。ご質問がある場合は、メッセージを残してコミュニケーションをとることができます。