【问题标题】:Is it possible to override a method at runtime?是否可以在运行时覆盖方法?
【发布时间】:2018-11-12 00:16:02
【问题描述】:

是否有在运行时覆盖方法?即使它需要从该实例动态创建子类?

【问题讨论】:

  • 为什么?你想做什么?
  • @Maxwell 您想要这样做的原因是什么?您是否只能在运行时确定方法详细信息?
  • 这是您可能想要的原因:您使用的是 jar/maven 库。它工作得很好,但一种方法很糟糕......它隐藏在代码中。覆盖不是一种选择。用另一种纠正行为的方法替换一种方法会很好。

标签: java overriding


【解决方案1】:

对于纯 Java,没有。

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

在纯 Java 中,在这种情况下要做的事情是创建一个 interface-based proxy 来处理方法调用并委托给原始对象(或不委托)。

【讨论】:

    【解决方案2】:

    您可以创建一个 anonymous class 来覆盖该方法并使用 strategy pattern 来决定要做什么。

    如果你正在寻找代码动态编译,可以关注these instructions

    【讨论】:

    • 顺便说一句,我使用动态编译在 .NET 中实现了脚本测试框架。我阅读了一个 C# 脚本并编写了一个类:“public class Test { public void Method() {" + userScript + "}}"。然后我只是构建整个东西并使用反射调用“Test.Method”,就像在我发送的链接中一样。
    【解决方案3】:

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

    我不知道你打算在什么情况和设计下覆盖,但重点是你替换了方法的行为,这就是覆盖所做的。

    【讨论】:

      【解决方案4】:

      我认为使用简单的 Java 是不可能的。 使用反射和/或 cglib 可能你可以做到。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-05-24
        • 2017-01-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多