27

Java 6では、次のメソッド シグネチャがあるとします。

public void makeSandwich(Bread slice1, Bread slice2, List<Filling> fillings, boolean mustard)

実行時に渡された値slice2または他のパラメーターを知りたいのですが、ここで重要なのは、パラメーター名で値を取得したいということです。

getParameterTypesorを使用してパラメータ タイプのリストを取得する方法を知っていますgetGenericParameterTypes

理想的には、型ではなくパラメーター名のリストを取得したいと考えています。そうする方法はありますか?

4

8 に答える 8

54

パラメーター名は、コンパイラーにそれらを含めるように指示した場合に使用できます (デバッグ情報を使用してコンパイルします)。Spring には ParameterNameDiscoverer、名前を取得するのに役立つものがあります。デフォルトの実装では、asmClassReaderを使用してこれを行います。

デバッグ情報を含めるには、引数を含める必要javacがあります。-gEclipse では、デフォルトでそこにあると思います。設定を使用して構成できます: Java -> Compiler そして、「メソッドパラメーターに関する情報を保存する(リフレクション経由で使用可能)」を有効にします(この回答も参照してください)。

一部のフレームワークはこれを使用します。たとえば、spring-mvc には@RequestParam、解決可能な場合、デフォルトで param 名になるものがあります。@RequestParam("foo")また、デバッグ情報が提供されていない場合に備えて、明示的な命名もサポートしています。

于 2011-07-20T09:46:25.770 に答える
11

この質問を回答済みとしてマークした後、別の解決策を見つけました。解決策はParanamerです。

例:

 Method method = Foo.class.getMethod(...);

 Paranamer paranamer = new CachingParanamer();

 String[] parameterNames = paranamer.lookupParameterNames(method) // throws ParameterNamesNotFoundException if not found

 // or ...

 parameterNames = paranamer.lookupParameterNames(method, false) // will return null if not found
于 2011-07-20T21:53:05.357 に答える
4

この回答に加えて、「コンパイラーにそれらを含めるように指示した場合、パラメーター名は利用可能です」

Eclipse を使用している場合は、プロジェクト -> プロパティ -> Java コンパイラ -> 「メソッド パラメータに関する情報を保存する (リフレクション経由で使用可能)」にチェックを入れます。

于 2016-05-04T07:26:02.263 に答える
2

これは不可能です。ソースが利用できない場合の IDE のオートコンプリートでわかるように、クラス ファイルには引数名が含まれていません。

したがって、リフレクション API はパラメーター名を提供できません。

于 2011-07-20T09:41:57.497 に答える
2

Java では、リフレクションを介してパラメーター名を使用することはできません。

于 2011-07-20T09:42:32.127 に答える
0

パラメータの値を別の値に割り当てるだけです

Bread slice2;

public void makeSandwich(Bread slice1, Bread slice2, List<Filling> fillings, boolean mustard) {
    this.slice2 = slice2;
    System.out.println(this.slice2.getSomething());
}
于 2011-07-20T09:44:46.960 に答える
0

メソッドのコードを所有していますか? パラメータに注釈を付けて、名前を引数として渡すことができます@Param("slice1")。後で、注釈を取得して、そこからパラメーター名を抽出できます。

于 2011-07-20T09:50:33.460 に答える