繁体   English   中英

是否可以在运行时覆盖方法?

[英]Is it possible to override a method at runtime?

反正有没有在运行时覆盖一个方法? 即使它需要从该实例动态创建子类?

用普通的Java,没有。

使用ByteBuddy (首选), asmcglibaspectj ,是的。

在普通的Java中,在这种情况下要做的事情是创建一个基于接口的代理来处理方法调用并委托给原始对象(或不是)。

您可以创建一个覆盖该方法的匿名类 ,并使用策略模式来决定要执行的操作。

如果要从代码中查找动态编译​​,可以按照这些说明进行操作

正如其他人所说,不,你不能在运行时覆盖一个方法。 但是,从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

我不知道你打算在什么情况和设计中覆盖,但关键是你要替换方法的行为,这就是重写的行为。

我认为简单的Java不可能。 有了反射和/或cglib,你可以做到。

看看这些链接:
http://www.rgagnon.com/javadetails/java-0039.html
http://www.javaworld.com/javaworld/jw-06-2006/jw-0612-dynamic.html

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM