簡體   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