Java 是否可以在运行时重写方法?

Java 是否可以在运行时重写方法?,java,overriding,Java,Overriding,在运行时是否有重写方法的方法?即使它需要从该实例动态创建一个子类?使用纯Java,也不行 使用(首选),或者,是 在纯Java中,在这种情况下要做的事情是创建一个处理方法调用并委托给原始对象(或不委托)的对象。我认为使用简单Java是不可能的。 使用反射和/或cglib,您可能可以做到这一点 查看这些链接: 您可以创建一个覆盖该方法并使用来决定要做什么的 如果您正在从代码中寻找动态编译,您可以按照别人所说的那样进行,不,您不能在运行时重写方法。但是,从Java8开始,您可以采用函数式方法。是一

在运行时是否有重写方法的方法?即使它需要从该实例动态创建一个子类?

使用纯Java,也不行

使用(首选),或者,是


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

我认为使用简单Java是不可能的。 使用反射和/或cglib,您可能可以做到这一点

查看这些链接:

您可以创建一个覆盖该方法并使用来决定要做什么的


如果您正在从代码中寻找动态编译,您可以按照别人所说的那样进行,不,您不能在运行时重写方法。但是,从Java8开始,您可以采用函数式方法。是一个函数接口,允许您将函数视为引用类型。这意味着您可以创建多个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();
    }
}
公共类示例{
函数计算;
公共示例(){
CalculateFunction=input->input+1;
系统输出println(计算(10));
//各种事情都会发生
CalculateFunction=input->input-1;
系统输出println(计算(10));
}
公共整数计算(整数输入){
返回CalculateFunction.apply(输入);
}
公共静态void main(字符串[]args){
新例子();
}
}
输出:

11
九,


我不知道您打算在什么情况下和设计下重写,但关键是您要替换方法的行为,而重写就是这样做的。

为什么?你想做什么?@Maxwell你想这么做的理由是什么?您是否只能在运行时确定方法详细信息?您可能需要这样做的原因是:您正在使用一个jar/maven库。它工作得很好,但有一种方法不好。。它隐藏在代码中。覆盖不是一个选项。用一种方法替换另一种方法来纠正这种行为会很好。顺便说一句,我使用动态编译在.NET中实现了一个脚本测试框架。我读了一个C#脚本并编写了一个类:“公共类测试{public void Method(){”+userScript+“}}”。然后我构建了整个过程,并使用反射调用“Test.Method”,就像我发送的链接一样。