ホームページ >Java >&#&チュートリアル >コード内のメソッドパラメータ名情報を取得するJavaメソッド

コード内のメソッドパラメータ名情報を取得するJavaメソッド

高洛峰
高洛峰オリジナル
2017-01-22 10:46:022691ブラウズ

前書き

Java8 を使用すると、特定のパラメーター情報を表す新しいオブジェクト パラメーターが、その getName を通じて取得できることは誰もが知っています。 , username という名前の場合、フォアグラウンドでパラメーターを渡すときに @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 で、中国語のローカル変数テーブルとメソッド パラメーター テーブルにコンパイルされます。 Code 属性 つまり、methodInfo の属性でもあります。メソッドにメソッド本体がある場合、対応する Code 属性が表示され、code 属性には、特定の実行コードに加えて、 LineNumberTable (コードの各行の位置を記述するために使用されます) などの他の情報です。

ローカル変数テーブルはメソッド内のデバッグ情報の一部であるため、デフォルトではこの情報はクラス ファイルには生成されません。 -g または -g: vars スイッチを有効にする必要があります。幸いなことに、IDE または Maven のコンパイルでは、これらのスイッチはデフォルトでオンになっており、(アイデアのデバッグ情報を生成する) (デフォルトのチェックマーク) を設定することで制御できます。 Maven では、プラグイン maven-compiler-plugin の debug または debugLevel で出力するかどうかを制御します (デフォルト値は true)。以下に示すように、ローカル変数テーブルは javap の後にあります。ローカル変数テーブルはパラメータ情報を保存するだけでなく、宣言された int i などのメソッド本体全体で使用される可能性のある一時変数にも保存されます。そして、上に示したように、式メソッドと非静的メソッドそもそもこの変数には違いがあるので、パラメータの数を取得(method.getParameterCount)して、メソッドのシグネチャに従ってローカル変数テーブル内の指定された数のパラメータ情報を読み込むことができます。

上の図では、パラメータが long または double の場合、そのスロットは 2 つのスペースを占有します。スロットを通じてパラメータ情報を取得する場合、パラメータの型情報を考慮する必要はありません。コード属性を持っているため、ローカル変数テーブルはありません インターフェイスのメソッド定義を取得して渡します ローカル変数テーブルからは対応するパラメータ名を取得できません

MethodParameters メソッドパラメータテーブル

メソッドパラメータテーブルは1.8以降に導入されました、したがって、jdk8 を使用してコンパイルされたクラス ファイルのみがこの情報を持ちます。ローカル変数テーブルとは異なり、これは MethodInfo 属性に属します。つまり、インターフェイス メソッドまたは通常のメソッドと同じレベルにあります。この属性を持っているため、たとえインターフェースメソッドであっても、対応するパラメータ情報を取得できます。

デフォルトでは、クラス内にそのような情報は存在せず、それを生成するには特別なコンパイルパラメータ -parameters を使用する必要があります。 IDE と Maven では、この情報はデフォルトでは生成されません。Idea では、このコンパイル パラメーターを Java に追加する必要があります。Maven では、このパラメーターを maven-compiler- の COMPILERARGS パラメーターにも追加する必要があります。プラグインのメソッドパラメータテーブルは、javap 後の形式になります:

//非静态方法
  LocalVariableTable:
  Start Length Slot Name Signature
   0  1  0 this LT;
   0  1  1 count J
   0  1  3 name Ljava/lang/String;
  
//静态方法
  LocalVariableTable:
  Start Length Slot Name Signature
   0  101  0 args [Ljava/lang/String;


パラメータテーブルには、静的であるかどうかに関係なく、パラメータを記述するために使用される情報のみが表示されます。次の Flags パラメータは、メソッド書き換えのための最終パラメータなど、いくつかの特別なシナリオで使用されます。

使用できるいくつかのツール

ネイティブの使用に加えて、API、Spring ツールキット、およびその他のツールはパラメータ名情報を取得できますSpring システムでは、パラメータ名を記述するために使用されるインターフェイスは ParameterNameDiscoverer であり、これを通じて、対応するパラメータ名の情報を取得できます。また、このツールキットの Paranamer も対応する情報を処理できます。ただし、jdk8のmethodParametersのサポートはそれほど高くはなく、ユーザーはそれを拡張することで独自の目的を達成できます。

概要

上記は、Javaがコード内のメソッドパラメータ名の情報を取得する方法の概要です。 Java を学習または使用するすべての人に役立ちます。質問がある場合は、メッセージを残して連絡してください。

コード内のメソッド パラメーター名の情報を取得する Java のメソッドに関連するその他の記事については、PHP 中国語 Web サイトに注目してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。