6

PHPにあるように、Javaで魔法のメソッドを使用する方法はあり__callますか?

例えば:

 class foo {
     @Setter @Getter
     int id;

     @Getter
     Map <String, ClassInFoo> myMap;

     protected class ClassInFoo {
          @Setter @Getter
          String name;
     }

     @Setter
     String defaultKey;
 }

コードを簡素化するために、getter メソッドと setter メソッドにProject Lombokアノテーションを使用しています。

私のマップには文字列によってマップされたいくつかのアイテムが含まれており、defaultKey はデフォルトのものを定義していると考えてみましょう。

私が望むのはfoo.getName()、デフォルト名を として返す呼び出しができることですfoo.myMap.get(defaultKey).getName()

すべてのゲッターを手動で記述できない理由は、実際には Foo クラスがジェネリックで継承されており、内部クラスが異なる可能性があるためです。

私は次のようなものが必要です:

   function Object __call(method) {
           if (exist_method(this.method)
                return this.method();
           else 
                return this.myMap.get(defaultKey).method();
   }

これはどういうわけかJavaで可能ですか?

編集:

ここで達成しようとしていることのより正確な例を作成しました: https://gist.github.com/1864457

これを行う唯一の理由は、内部クラスのメソッドを「簡略化」することです。

4

2 に答える 2

8

次のような機能を使用して、リフレクションを介して絶対に行うことができます

public Method getMethod(String name, Class<?>... parameterTypes)

クラスにいくつかのメソッドが定義されているかどうかを確認するために使用できますが、インターフェイス、継承、およびメソッドのオーバーライドを適切に使用して問題を解決できない方法がわかりません

リフレクションなどの機能は、他の方法では解決できない特定の問題を管理するために提供されていますが、Java は PHP ではないため、可能な限り使用を避けるようにしてください。これは言語の哲学に含まれていないためです。

于 2012-02-19T14:55:23.090 に答える
3

それは継承とオーバーライドの全体的なポイントではありませんか?

基本クラス:

public Object foo() {
    return this.myMap.get(defaultKey).method();
}

サブクラス:

@Overrides
public Object foo() {
    return whateverIWant;
}
于 2012-02-19T14:51:11.783 に答える