2011-11-24 13 views
5

クラスの特定のインスタンスのメソッドをリフレクションでオーバーライドすることはできますか?クラスのインスタンスのメソッドをオーバーライドしますか?

前提条件:ゲームにオーバーライド可能なメソッドact()があります。

public class Foo { 

    public Method[] getMethods() { 
    Class s = Game.class; 
    return s.getMethods(); 
    } 

    public void override() 
    { 
    Method[] arr = getMethods() 
    for (int i = 0; i<arr.length; i++) 
    { 
     if (arr[i].toGenericString().contains("act()") 
     { 
     // code to override method (it can just disable to method for all i care) 
     } 
    } 
    }     
} 
+1

この種の黒い魔法が本当に必要な場合を除き、バイトコードのエンジニアリングとプロキシを使用して、このようなことを行うことができます。 –

+2

ローカルの匿名の内部クラスメソッドを使用するだけでは不十分なのはなぜですか?実際のクラスのサブクラス化。 – zeller

+0

与えられたインスタンスからサブクラスを動的に作成し、そのクラスのactメソッドをオーバーライドし、以前のインスタンスを破棄する方が簡単でしょうか? –

答えて

7

ゲームがインターフェイスであるか、そのためにProxyを使用することができますact()方法とのインタフェースを実装している場合。インターフェイスが小さい場合、最も洗練された方法はおそらくDecorator design patternを使用して実装するクラスを作成することです。

+2

+1デコレータの提案。ここでの反射の必要はありません。 – artbristol

+2

ゲームはクラス –

+0

のコード例ですか? –

1

純粋なJavaを使用してクラスのメソッドを動的にオーバーライドすることはできません。 The third-party library cglibは動的サブクラスを作成できます。あなたはそれをチェックしたいかもしれません。

インターフェイスに対してコード化できる場合は、Java dynamic proxyを使用して、以下の例のように動作をオーバーライドするプロキシオブジェクトを作成できます。 GameがインターフェイスIGameを実装していたとします。

関連する問題