无论如何都要在运行时覆盖一个方法?即使它需要从该实例动态创建子类?
答案 0 :(得分:12)
使用普通Java,没有。
使用ByteBuddy(首选),asm,cglib或aspectj,是。
在普通的Java中,在这种情况下要做的事情是创建一个interface-based proxy来处理方法调用并委托给原始对象(或不是)。
答案 1 :(得分:2)
您可以创建一个覆盖该方法的anonymous class,并使用strategy pattern来决定该怎么做。
如果您正在寻找代码中的动态编译,可以按照these instructions
进行操作答案 2 :(得分:0)
我认为使用简单的Java是不可能的。 有了反射和/或cglib,你可以做到。
看看这些链接:
http://www.rgagnon.com/javadetails/java-0039.html
http://www.javaworld.com/javaworld/jw-06-2006/jw-0612-dynamic.html
答案 3 :(得分:0)
正如其他人所说,不,你不能在运行时覆盖一个方法。但是,从Java 8开始,您可以采用功能方法。 Function
是一个功能接口,允许您将函数视为引用类型。这意味着您可以创建多个并在它们之间切换(动态)a-la策略模式。
让我们看一个例子:
public class Example {
Function<Integer, Integer> 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
我不知道你打算在什么情况和设计中覆盖,但关键是你要替换方法的行为,这就是重写的行为。