9

Java でリフレクションのメソッドを静的に参照する方法はありますか。私が何をしようとしているのかを理解するためのコード例を次に示します。

public void myFunc(int x) { ... }

public void other() {
    Method m1 = getClass().getMethod("myFunc");  // dynamic
    Method m2 = this.myFunc;                     // static
    Method m3 = MyClass.myFunc;                  // static (alternate)
}

上記の構文が機能しないことは認識していますが、実際に機能するこれに似た構文があるかどうか疑問に思っていました。文字列でメソッドを参照することの固有の危険性を心配することなく、リフレクションを使用する方法が必要です。

これを行う方法はありますか、それともただの夢物語ですか?

4

2 に答える 2

3

メソッドリファレンスは説明します

2つのPersonインスタンスの生年月日を比較するこのメソッドは、すでにとして存在しPerson.compareByAgeます。代わりに、ラムダ式の本体でこのメソッドを呼び出すことができます。

Arrays.sort(rosterAsArray,
    (a, b) -> Person.compareByAge(a, b)
);

このラムダ式は既存のメソッドを呼び出すため、ラムダ式の代わりに>メソッド参照を使用できます。

Arrays.sort(rosterAsArray, Person::compareByAge);

次に、さまざまな種類のメソッド参照について説明します。

メソッド参照には次の4種類があります。

Reference to a static method      ContainingClass::staticMethodName

Reference to an instance method
of a particular object            containingObject::instanceMethodName

Reference to an instance method   ContainingType::methodName
of an arbitrary object of a
particular type

Reference to a constructor        ClassName::new

ヒストリカルノート(Java 8が完成する前に書かれました)

Javaクロージャの提案はこんな感じだと思います。 スティーブンコレボーンは言う:

Stefanと私は、First-class Methods:Javaスタイルのクロージャ提案のv0.4のリリースを発表できることを嬉しく思います。

変更点

v0.3以降、さまざまなフォーラムで受け取ったフィードバックの一部を取り入れようとしています。主な変更点は次のとおりです。

1)コンストラクターとフィールドのリテラル。FCM構文java.lang.reflect.Constructorを使用して、タイプセーフでコンパイル時に変更されたインスタンスを作成できるようになりました。Field

// method literal:
Method m = Integer#valueOf(int);

// constructor literal:
Constructor<Integer> c = Integer#(int);

// field literal:
Field f = Integer#MAX_VALUE;

しかし、この構文は出荷用のJVMでは使用できないと思います。クロージャ自体は間違いなくJava7にはありません。Java8で表示される場合があります。

Javaクロージャサイトには、構文があまり変更されていないように見えますが、もう少し最新の「メソッド参照」へのポインタがあります。

于 2012-11-25T20:00:31.480 に答える
-2

JSR-335はあなたが探しているものです。JDK 8で利用できるようになることを願っています。

于 2012-11-25T20:02:17.543 に答える