2012-02-19 4 views
6

PHPのように、__callのようなJavaのマジックメソッドを使用する方法はありますか?例えばJavaのメソッドを魔法のように呼び出す

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注釈を使用しています。

私のマップにはStringによってマップされたいくつかのアイテムが含まれており、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でこの何とか可能ですか?

EDIT:

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

これを行うための唯一の理由は「速記」内部クラスのメソッドです。

+0

興味深い質問としてUpvotingしかし、これはOOPのタグを付けてはいけません。興味のある機能はオブジェクト指向ではなく、実際には必ずしも動的ではありません。 – Perception

+1

一般に、IDEで生成できる独自のゲッターとセッターが必要です。たとえば、getterに可変コレクションを返させるのは良い考えではありません。代わりに 'ClassInFoo getMyMap(String name)'を持つことができます –

+0

ええ、私はすべてのゲッターを書くことができますが、重複して醜いと感じました。 HTMLコーディング担当者がこれらのメソッドを簡単に要求できるように、私はこれが好きです。 –

答えて

5

あなた絶対にできるクラスが持っているかどうかを確認するために使用することができます

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

のように、その機能を使用してreflectionていくつかのメソッドが定義されていますが、私はあなたの問題が適切な使い方で解決できないのを見ていません。 Fインタフェース、メソッドの継承とオーバーライド反射などの

機能は、特定の管理するために提供され、それ以外の場合は解けない、問題がありますが、可能な場合、それを利用するのは避けるべきですので、それはの哲学ではありませんので、Javaは、PHPではありません言語。

+0

を読むことで、この問題を解決するのに役立ちました。ありがとう! –

2

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

基本クラス:

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

サブクラス:

@Overrides 
public Object foo() { 
    return whateverIWant; 
} 
+0

私はここでより正確な例を作りました:https://gist.github.com/1864457 - あなたの提案をもっと詳しく説明できますか?ありがとう。 –

+0

FruitクラスのgetName()メソッドが次のように実装されている場合、期待通りに動作します:return getContents()。get(getDefaultKey())。getName() '継承とオーバーライドの仕組みを理解していますか? http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html –

関連する問題