2011-11-24 69 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

如果游戏是一个接口或实现与方法的接口act()您可以使用Proxy了点。如果界面很小,最优雅的方式可能是创建一个实现它的类,使用Decorator design pattern

+2

+1的装饰建议。这里不需要反思。 – artbristol

+2

游戏是一个类 –

+0

代码示例? –

1

使用纯Java动态重写类的方法是不可能的。 The third-party library cglib可以创建动态子类。你可能想检查一下。

如果您可以针对接口进行编码,那么您可以使用Java dynamic proxy创建一个覆盖行为的代理对象,如下例所示。假设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[] { }); 
相关问题