Có một cách khác để bạn tận dụng lợi thế của JVM HotSwapping.
Giả sử bạn đang triển khai mã cho một số máy chủ. Sau đó, khi bạn khởi động ứng dụng, hãy chắc chắn rằng bạn bật gỡ lỗi từ xa (mà tôi nghĩ rằng bạn có kể từ khi bạn đang gỡ lỗi và đang nói về triển khai). Nếu không thì nó sẽ làm việc đồng đều tốt trong trình gỡ lỗi cục bộ.
Bây giờ tôi có hai lớp, Chính và Khác.
package com.stackoverflow;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
doStuff();
}
private static void doStuff() throws IOException {
System.out.println("doStuff");
Other.otherStuff();
}
public static void throwException() throws IOException {
throw new IOException();
}
}
package com.stackoverflow;
import java.io.File;
import java.io.IOException;
public class Other {
public static void otherStuff() throws IOException {
File file = new File("Some_File.txt");
file.createNewFile();
}
}
Các throwException()
có thể được đặt ở bất cứ đâu miễn là nó là "toàn cầu" có sẵn trong một số lớp util ví dụ. Bây giờ nó chỉ được đặt trong lớp chính của tôi cho thuận tiện.
Bây giờ chúng ta có thể có một breakpoint đặt trong phương pháp doStuff()
của chúng tôi và trong khi bị giam giữ ở đó chúng ta có thể thay đổi mã trong phương pháp otherStuff()
để nó gọi throwException()
phương pháp tĩnh của chúng tôi.
public static void otherStuff() throws IOException {
Main.throwException();
File file = new File("Some_File.txt");
file.createNewFile();
}
Chúng ta phải gọi một số phương pháp thay vì cách gọi throw new IOException()
bởi vì nếu không chúng ta sẽ có lỗi với Unreachable statement
.
Sau đó chúng ta có thể nhấn tổ hợp phím Ctrl + phím Shift +F9 phải biên dịch lại lớp khác. Nó sẽ được HotSwapped (một hộp thoại sẽ hỏi nếu bạn thực sự muốn làm điều này).
Sau đó nhấn tiếp tục và ngoại lệ sẽ được ném.
Mã này sau đó có thể được hoàn nguyên về trạng thái bình thường.
Điều tốt về điều này là lớp được biên dịch lại thậm chí sẽ được trao đổi nóng "qua dây" với máy từ xa.
Điều quan trọng là mã mà bạn biên dịch lại phải nằm trong một lớp khác. Cùng một lớp mà bạn có điểm dừng của bạn sẽ không được tải lại chính xác.
Là một công việc xung quanh, tôi có thể sửa đổi mã để ném ngoại lệ và triển khai lại. Nhưng tôi tự hỏi nếu có một cách để làm điều này trong trình gỡ rối mà không sửa đổi mã nguồn.
Bạn sẽ sửa đổi mã nhưng chỉ vào thời điểm bạn muốn, trong trình gỡ lỗi. Sau đó bạn có thể quay trở lại thay đổi nhỏ và biên dịch lại để trao đổi nóng lại mã cũ.
Tôi hy vọng bạn có ý tưởng (không có ý định chơi chữ).
Tôi có thể thêm ảnh chụp màn hình nếu bạn muốn.
Nó không chắc rằng có một cách để làm những gì bạn đang yêu cầu. Tôi sẽ đề nghị xem xét một thiết kế khác dễ dàng tạo điều kiện cho loại thử nghiệm này - ví dụ [tiêm phụ thuộc] (http://en.wikipedia.org/wiki/Dependency_injection). –
@RobI tiêm phụ thuộc là tốt. Tôi không thấy nó giúp tôi như thế nào. Bạn có thể xây dựng? –
Ý tưởng ngắn: tạo một giao diện để thực hiện những gì bạn đang làm trong khối mã đôi khi làm tăng ngoại lệ (giả sử 'IODoer' với phương thức' do() '). Việc thực thi thực sự của bạn là trong một lớp cụ thể 'IODoerImpl', với tất cả mã thực, nhưng bạn có một lớp' TestIODoer' cụ thể khác, điều này làm tăng một ngoại lệ mỗi khi bạn gọi phương thức 'do()' hoặc mọi thời gian khác, hoặc bất cứ khi nào ... Thông thường chương trình của bạn sử dụng việc triển khai thực sự, nhưng trong quá trình thử nghiệm, bạn có thể tiêm lớp thử nghiệm này thay thế. –