クラスのインスタンスのメソッドをオーバーライドしますか?

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

前提条件:ゲームにオーバーライド可能なメソッド 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
5
前にこれをやったことはありませんでしたが、この質問はとても役に立つようです...その答えを楽しみにしています。
追加された 著者 amod,
この種の黒い魔法が本当に必要な場合を除いて、バイトコードのエンジニアリングとプロキシを使用して、このようなことを行うことができます。
追加された 著者 Maurício Linhares,
ローカルの匿名の内部クラスのメソッドを使用するだけでは不十分なのはなぜですか?実際のクラスのサブクラス化。
追加された 著者 zeller,
指定されたインスタンスからサブクラスを動的に作成し、そのクラスのactメソッドをオーバーライドし、前のインスタンスを破棄する方が簡単でしょうか?
追加された 著者 Maxwell Dergosits,

2 答え

Gameがインタフェースであるか、または act()メソッドを使用してインタフェースを実装する場合は、プロキシインターフェイスが小さい場合、最もエレガントな方法は、デコレータデザインパターンを使用して実装するクラスを作成することでしょう。

7
追加された
デコレーター提案の+1。ここでの反射の必要はありません。
追加された 著者 artbristol,
コード例?
追加された 著者 Jemshit Iskenderov,
ゲームはクラスです
追加された 著者 Maxwell Dergosits,

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

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

class GameInvocationHandler implements InvocationHandler
{
    private Game game;
    public GameInvocationHandler(Game game)
    {
        this.game = game;
    }
    Object invoke(Object proxy, Method method, Object[] args)
    {
        if (method.toGenericString().contains("act()")
        {
            //do nothing;
            return null;
        }
        else
        {
            return method.invoke(game, args);
        }
    }
}

Class proxyClass = Proxy.getProxyClass(Foo.class.getClassLoader(), IGame.class);
IGame f = (IGame) proxyClass.getConstructor(InvocationHandler.class).newInstance(new Object[] {  });
0
追加された