Javassist:重新创建一个类 - 先删除,还是 defrost() 然后修改?

标签 java classloader javassist bytecode-manipulation

我使用 Javassist 创建一个类。在测试套件中,当第二个测试试图创建相同的类时,它在 pool.makeClass( ... ) 处失败,因为该类被卡住(即已经通过 toClass( )

克服这个问题的方法是什么?理想情况下,第一个测试应该以某种方式删除类——也许从类加载器中卸载——但正如我所读in JLS ,卸载操作不可靠。

所以也许解决方法是检查创建代码的类是否存在,如果存在,defrost() 它,删除所有成员等,然后重新创建它。

还有其他想法吗?

或者有什么可靠的方法可以通过 Javassist 删除类吗?

最佳答案

您不能从 ClassLoader 卸载单个类。如果一个类及其 ClassLoader 变得无法访问,则该类可能会被卸载,但由于每个类都引用其加载器,这意味着该加载器加载的所有类也必须变得无法访问。

但是您可以使用不同的 ClassLoader(重新)创建类。好吧,从形式上讲,它是一个具有相同名称(可能还有相同字节码)的不同类。如果在测试用例中执行的代码没有在堆中留下任何引用,则可能会在测试后收集 ClassLoader 及其类。

关于Javassist:重新创建一个类 - 先删除,还是 defrost() 然后修改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17323300/

相关文章:

java - Hibernate 找不到适合 jdbc 的驱动程序

java - 在 tomcat/shared/lib 中获取 jar 以使用调用它们的 webapp 的配置进行记录

spring - 使用 Javassist 将代码注入(inject)方法

java - 用java中的sql查询更新5个组合框

java - javamail 在发送前将附件加载到内存中吗?

java - 如何在 Web 应用程序中接收正确的 jar 类加载器?

java - AspectJ 可以将字段调用替换为 getter/setter 吗?

java-bytecode-asm - 动态Java字节码操作框架比较

java - 如何获取自动生成的键并设置结果集类型?

java - 尝试调用虚拟方法。显示位置的应用程序