是否可以在运行时覆盖方法?
反正有没有在运行时覆盖一个方法? 即使它需要从该实例动态创建子类?
用普通的Java,没有。
使用ByteBuddy (首选), asm , cglib或aspectj ,是的。
在普通的Java中,在这种情况下要做的事情是创建一个基于接口的代理来处理方法调用并委托给原始对象(或不是)。
您可以创建一个覆盖该方法的匿名类 ,并使用策略模式来决定要执行的操作。
如果要从代码中查找动态编译,可以按照这些说明进行操作
你的意思是这样的: http : //cglib.sourceforge.net/apidocs/net/sf/cglib/Enhancer.html
我认为用简单的Java不可能。 有了reflection和/或cglib,你可以做到。
看看这些链接:
http://www.rgagnon.com/javadetails/java-0039.html
http://www.javaworld.com/javaworld/jw-06-2006/jw-0612-dynamic.html
正如其他人所说,不,你不能在运行时覆盖一个方法。 但是,从Java 8开始,您可以采用function方法。 Function
是一个function接口,允许您将函数视为引用类型。 这意味着您可以创建多个并在它们之间切换(动态)a-la策略模式。
我们来看一个例子:
public class Example { Function calculateFuntion; public Example() { calculateFuntion = input -> input + 1; System.out.println(calculate(10)); // all sorts of things happen calculateFuntion = input -> input - 1; System.out.println(calculate(10)); } public int calculate(int input) { return calculateFuntion.apply(input); } public static void main(String[] args) { new Example(); } }
输出:
11
9
我不知道在什么情况和设计中你想要覆盖,但重点是你替换方法的行为,这是重写的行为。