作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我使用 Javassist 创建一个类。在测试套件中,当第二个测试试图创建相同的类时,它在 pool.makeClass( ... )
处失败,因为该类被卡住(即已经通过 toClass( )
。
克服这个问题的方法是什么?理想情况下,第一个测试应该以某种方式删除类——也许从类加载器中卸载——但正如我所读in JLS ,卸载操作不可靠。
所以也许解决方法是检查创建代码的类是否存在,如果存在,defrost()
它,删除所有成员等,然后重新创建它。
还有其他想法吗?
或者有什么可靠的方法可以通过 Javassist 删除类吗?
最佳答案
您不能从 ClassLoader
卸载单个类。如果一个类及其 ClassLoader
变得无法访问,则该类可能会被卸载,但由于每个类都引用其加载器,这意味着该加载器加载的所有类也必须变得无法访问。
但是您可以使用不同的 ClassLoader
(重新)创建类。好吧,从形式上讲,它是一个具有相同名称(可能还有相同字节码)的不同类。如果在测试用例中执行的代码没有在堆中留下任何引用,则可能会在测试后收集 ClassLoader
及其类。
关于Javassist:重新创建一个类 - 先删除,还是 defrost() 然后修改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17323300/
我使用 Javassist 创建一个类。在测试套件中,当第二个测试试图创建相同的类时,它在 pool.makeClass( ... ) 处失败,因为该类被卡住(即已经通过 toClass( )。 克服
我是一名优秀的程序员,十分优秀!