还有另一种方法可以利用 JVM HotSwapping。
假设您正在将代码部署到某个服务器。然后,当您启动应用程序时,请确保您打开远程调试(我认为您在调试并且正在谈论部署时已经打开了)。如果不是,那么它将在本地调试器中正常工作。
现在我有两个类,主要和其他。
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();
}
}
throwException()
只要它“全局”可用,就可以放置在任何地方,例如在某些 util 类中。为了方便起见,现在它只是放在我的 Main 类中。
现在我们可以在我们的doStuff()
方法中设置一个断点,并且在保留在那里的同时,我们可以更改otherStuff()
方法中的代码,以便它调用我们的静态throwException()
方法。
public static void otherStuff() throws IOException {
Main.throwException();
File file = new File("Some_File.txt");
file.createNewFile();
}
我们必须调用一些方法而不是调用throw new IOException()
,否则我们会遇到错误Unreachable statement
。
然后我们可以按Ctrl++Shift重新F9编译Other类。现在它将是 HotSwapped(一个对话框将询问您是否真的要这样做)。
然后按继续,就会抛出异常。
然后可以将代码恢复到正常状态。
这样做的好处是重新编译的类甚至可以“通过网络”热交换到远程机器。
重要的是您重新编译的代码必须在另一个类中。您有断点的同一类将无法正确重新加载。
作为一种解决方法,我可以修改代码以引发异常并重新部署。但我想知道是否有办法在调试器中执行此操作而无需修改源代码。
您将在调试器中修改代码,但仅在您需要的时候进行。然后,您可以恢复小更改并重新编译以热交换回旧代码。
我希望你明白这个想法(不是双关语)。
如果你愿意,我可以添加截图。