有沒有辦法在運行時重寫一個方法?即使它需要從該實例動態創建子類?是否可以在運行時重寫一個方法?
回答
用普通的Java,沒有。
With asm or cglib or aspectj,yes。
在純Java中,在這種情況下要做的事情是創建一個處理方法調用並委託給原始對象(或不是)的interface-based proxy。
我認爲它不可能簡單的Java。 有了反射和/或cglib,你可以做到。
看看這些鏈接:
http://www.rgagnon.com/javadetails/java-0039.html
http://www.javaworld.com/javaworld/jw-06-2006/jw-0612-dynamic.html
您可以創建一個anonymous class重寫方法和使用strategy pattern來決定做什麼。
如果你正在尋找從代碼動態編譯,你可以按照these instructions
順便說一句,我用動態編譯在.NET中實現腳本化的測試框架。我讀了一個C#腳本並編寫了一個類:「public class Test {public void Method(){」+ userScript +「}}」。然後,我只是建立了整個事情,並使用反射調用了「Test.Method」,就像在我發送的鏈接中一樣。 –
正如其他人說,不,你不能覆蓋在運行時的方法。但是,從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();
}
}
輸出:
我不知道下你打算重寫什麼情況下和設計,但重點是你替換方法的行爲,這是重寫的方式。
- 1. 在TypeScript中運行時是否可以檢測到重寫的方法?
- 2. 是否可以重寫Model.objects.all()方法?
- 3. 是否可以編寫一個創建方法的方法?
- 4. 是否可以在一個方法內部運行一個函數?
- 5. 是否可以在同一時間運行多個AsyncTask?
- 6. 是否可以「內聯」一個「方法」?
- 7. 是否可以重寫window.document.location.host?
- 8. 是否可以重寫drupal_build_css_cache?
- 9. 是否可以爲XAttribute和XElement編寫一個方法?
- 10. 是否有可能編寫一個方法揀選時間?
- 11. 是否可以用第一個大寫字母來重寫URL?
- 12. 是否有可能在另一個方法「AsyncTask」中運行「AsyncTask」方法?
- 13. 是否可以在delphi中更改方法體(重寫對象方法)?
- 14. 是否有任何算法來判斷運行時的Java方法重寫?
- 15. 檢查在運行時是否正在執行某個方法
- 16. 是否可以重載主方法?
- 17. Web方法是否可以重載?
- 18. 這是否可以重寫密封類的方法?
- 19. 是否可以同時運行一個WiX msi實例?
- 20. MongoClient的一個實例是否可以長時間運行
- 21. 是否可以創建「class」運行時?
- 22. 是否有可能相等/重寫一個函數/方法與另一個?
- 23. 是否可以在運行時驗證ASHX語法錯誤?
- 24. 在運行時確定Objective-C方法是否可變
- 25. 是否可以編寫一個在bash/shell和PowerShell中運行的腳本?
- 26. 是否可以在運行時修改可執行文件?
- 27. 當應用程序未在ios中運行時是否可以調用方法?
- 28. 運行時重命名php文件 - 是否可以鎖定?
- 29. 是否有可能重寫這個棘手的擴展方法?
- 30. 是否有一種方法可以始終以管理員身份運行vs.net?
爲什麼?你想做什麼? – SLaks
@Maxwell你想做這件事的理由是什麼?您是否只能在運行時確定方法的詳細信息? –