是否可以反射性地覆盖给定类的实例的方法?
前提条件:游戏具有覆盖方法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)
}
}
}
}
答案 0 :(得分:7)
如果Game是一个界面或使用方法act()
实现一个界面,你可以使用Proxy。如果界面很小,最优雅的方法可能是创建一个使用Decorator design pattern实现它的类。
答案 1 :(得分:0)
使用纯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[] { });