使用 javassist + spring + tomcat 在运行时更改 class

Change class on runtime using javassist + spring + tomcat

我想使用 javassist 库向 class 添加 1 个注释。 class 之前加载过一次,我知道我们不能在常规情况下重新加载这样的 class。 javassist HotSwapper 可以做到这一点,但我不知道哪个端口正在监听。调用此代码时出现连接被拒绝异常:

HotSwapper hs = new HotSwapper(8000);  // 8000 is a port number.

端口是什么? Java调试端口?代码在运行ning模式下可以使用吗? 我不知道如何在 运行 时间内重新加载 class。当我们使用 spring 和 tomcat 时可以吗?在 class 路径中加载任何其他 jar 文件之前,我如何 运行 我的代码?

谢谢

What is the port? Java debug port?

是的,您的 VM 参数中需要这样的内容:

-agentlib:jdwp=transport=dt_socket,address=localhost:8000,server=y,suspend=y

Can I use it when the code is in running mode?

是的。代理不会显着影响性能(据我所知,我不确定),但其他东西(连接到 jdwp 端口)当然可能会影响。

I don't know how i can reload the class in runtime. Is it possible when we are using spring and tomcat?

您可以尝试调用HotSwapperreload方法。从 javadoc (link to javadoc) 中查看此示例:

 CtClass clazz = ...
 byte[] classFile = clazz.toBytecode();
 HotSwapper hs = new HostSwapper(8000);  // 8000 is a port number.
 hs.reload("Test", classFile);