Giả sử chúng ta có một chương trình Java tầm thường mà bao gồm chỉ là một lớp:Thay đổi phương pháp khi chạy qua một cơ chế trao đổi nóng
public class HelloWorld {
private static void replacable(int i) {
System.out.println("Today is a nice day with a number " + i);
}
public static void main(String[] args) throws Exception {
for(int i = 0; i < 100000; ++i) {
replacable(i);
Thread.sleep(500);
}
}
Sau khi nó được biên dịch và chạy, đầu ra sẽ là thế này:
Hôm nay là một ngày tốt đẹp với một số 0
Hôm nay là một ngày tốt đẹp với một số 1
Hôm nay là một ngày tốt đẹp với một số 2
Hôm nay là một ngày tốt đẹp với một số 3
...
Câu hỏi của tôi: không có tồn tại (hoặc là có trên đường chân trời) một cách nào đó để trao đổi replacable
phương pháp trong thời gian chạy? Một cái gì đó như viết một phiên bản khác của HelloWorld
với một phiên bản mới của replacable
, biên dịch nó và sau đó là phiên bản cũ trong một JVM đã chạy?
Vì vậy, nếu tôi viết phiên bản mới như thế này:
private static void replacable(int i) {
System.out.println("Today is an even nicer day with a number " + i);
}
là có một cái gì đó tương tự như Erlang's hot code swapping nơi tôi có thể làm điều này:
- chạy chương trình gốc
- ghi sửa đổi phiên bản
- bằng chương trình dòng lệnh, kết nối với JVM đang chạy và thay thế phương thức hiện tại
do đó, trong thời gian chạy, điều này sẽ xảy ra:
Hôm nay là một ngày tốt đẹp với một số 15000
Hôm nay là một ngày tốt đẹp với một số 15001
Hôm nay là một thậm chí ngày đẹp hơn với số 15002
Hôm nay là một ngày đẹp hơn với số 15003
...
Giả sử rằng chương trình trên là độc lập, chạy trong môi trường Java SE chuẩn, không có gì khác trên classpath, vì vậy nó gần như là một chương trình kiểu thế giới Hello.
Lưu ý: Tôi biết rằng các công nghệ như thao tác bytecode (cglib), aspectJ, jRebel, JMX, hotswapping các phương pháp trong Java EE, vv tồn tại, nhưng chúng không phải là những gì tôi đang nghĩ đến việc. Hãy suy nghĩ về Erlang.
Bạn có thể giải thích lý do tại sao bạn không thể sử dụng Mẫu chiến lược (ví dụ: một đối tượng biến thực hiện chức năng biến bắt buộc) không? Các phương thức hoán đổi âm thanh phức tạp để đạt được những gì bạn muốn. – ivy
@ivy: Tôi có thể sử dụng điều đó, tất nhiên, nhưng tôi chỉ tự hỏi liệu có thể làm những gì tôi mô tả trong câu hỏi của mình hay không. Bạn có thể nghĩ nó như một câu hỏi "lý thuyết" theo một cách nào đó. – darioo
@ivy cơ chế có để nâng cấp dịch vụ đang chạy, không phải để chọn giữa một tập hợp các triển khai đã biết. –