Java swing应用程序是否支持动态代码编译?
我正在开发一个基于Swing的应用程序,并对源代码进行了更改。我本以为JVM会重新编译更改后的代码,但这并没有发生,是吗 当更改java源文件时,JVM从webapps后台进行编译,识别到更改并在Tomcat容器中重新编译,因此我不需要按类路径重新加载(通过重新启动Tomcat服务器)。如果变化很大,那么这并不总是有效的 我更改了来源。我本以为JVM会重新编译更改后的代码,但这并没有发生。应该有吗 不可以。假设您使用的是标准Java工具链,那么只有在运行Java swing应用程序是否支持动态代码编译?,java,swing,Java,Swing,我正在开发一个基于Swing的应用程序,并对源代码进行了更改。我本以为JVM会重新编译更改后的代码,但这并没有发生,是吗 当更改java源文件时,JVM从webapps后台进行编译,识别到更改并在Tomcat容器中重新编译,因此我不需要按类路径重新加载(通过重新启动Tomcat服务器)。如果变化很大,那么这并不总是有效的 我更改了来源。我本以为JVM会重新编译更改后的代码,但这并没有发生。应该有吗 不可以。假设您使用的是标准Java工具链,那么只有在运行javac时才会编译源代码。当然,JVM(
javac
时才会编译源代码。当然,JVM(即java
)既不编译源代码,也不会注意到源代码何时更改。实际上,它甚至不会注意到“.class”文件是否已更改1。
另一方面,如果您使用IDE来开发/编译/运行,那么它(而不是JVM)通常会注意到源代码的更改并自动重新编译。但是,如果您恰好在更改应用程序的同时运行,这些更改通常不会影响正在运行的程序2
1-可以对应用程序进行编码,使其注意到更改并尝试重新加载重新编译的类,但在这样做时会出现一系列问题和潜在陷阱。(对于运行时类型系统而言,多次加载一个类每次都会给您一个不同的类型。除非您可以重新加载整个应用程序,否则它会变得非常笨拙。)
2-某些IDE(例如Eclipse)在您对正在调试的类所使用的类进行更改时会注意到,并为您提供重新启动正在调试的应用程序的选择。这取决于您使用的工具(例如IDE)。JVM本身不会自动为您重新编译源代码。不,您必须重新启动appSee。