1

Java SE 8 (特にthreeten-extra#166に関して) のクラスに基づく静的インポート用に設計されたコードを作成しようとしています。

最初のパスとして、特定のクラス セットの静的ファクトリ メソッドに基づくメソッドの Java コードを自動的に生成します。私の希望は、何も見逃さないようにすること、手動エラーの可能性を減らすこと、およびコピー/貼り付けの繰り返しをなくすことです。

Java リフレクション API を使用して、Methodコードを自動生成するメソッドのオブジェクトを取得しています。Method次に、そのオブジェクトを使用してメソッド シグネチャを生成しています。

たとえば、LocalDate.of(int year, int month, int dayOfMonth)メソッドの場合、次のようなものが必要です。

public static LocalDate date(int year, int month, int dayOfMonth) {
    return LocalDate.of(year, month, dayOfMonth);
}

最も重要なのは、生成された Java コードの署名に、JDK と同じパラメーター名が含まれていることを確認することです。Java には、 を使用してメソッドのパラメーター名を取得する機能があることを知っていますParameter.getName()。ただし、メソッドのパラメーター名が存在するとは限りません。.classファイルはデフォルトではそれらを保存しません ( -parametersto オプションを指定javacすると含まれます)。私の特定のケースでは、パラメーター名は Java であり、(少なくとも私のバージョンでは) コンパイルされていません。

Method method = LocalDate.class
        .getMethod("of", int.class, int.class, int.class);

System.out.printf("public static %s date(%s) {\n",
        method.getReturnType().getSimpleName(),
        Arrays.stream(method.getParameters())
                .map(p -> String.format("%s %s",
                        p.getType().getSimpleName(), p.getName()))
                .collect(Collectors.joining(", ")));
System.out.printf("    return %s.%s(%s);\n",
        method.getDeclaringClass().getSimpleName(),
        method.getName(),
        Arrays.stream(method.getParameters())
                .map(Parameter::getName)
                .collect(Collectors.joining(", ")));
System.out.println("}");

出力:

public static LocalDate date(int arg0, int arg1, int arg2) {
    return LocalDate.of(arg0, arg1, arg2);
}

Paranamerライブラリを使用してJava 8 Javadocから引数名を読み取ろうとしましたが、Java 8 Javadoc HTML 形式 ( paranamer#39 )をサポートしていないようです。

私は現在SDKMANを使用しています!macOS で Java のバージョン ( AdoptOpenJDK8.x ) を管理します。Java のバージョン間でメソッドが同一である必要がある場合、Java 8 の特定のバージョンである必要はありませんが、Java 8 のバージョンである必要があります

Methodこの状況で組み込み Java SE 8 クラスのパラメータ名を取得するにはどうすればよいですか?

4

1 に答える 1