5

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

有什么办法可以克服呢?理想情况下,第一个测试应该以某种方式删除类 - 可能从类加载器中卸载 - 但正如我在 JLS中读到的,卸载操作不可靠。

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

还有其他想法吗?

还是有一些可靠的方法可以通过 Javassist 删除该类?

4

2 回答 2

4

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

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

于 2013-11-27T08:27:18.273 回答
0

我遇到了同样的问题,我是这样解决的,可能无法申请你的测试用例:

使 CtClass 成为您的 Class 的私有静态变量。

创建一个检查 CtClass 是否已经构建的方法。如果未构建 CtClass,则调用构建它的方法,否则,返回该 CtClass。

使您的所有测试都使用新方法。

所以,如果你有 N 测试,只有第一个会尝试构建 CtClass,其余的将有静态 CtClass 变量。

于 2014-06-18T19:18:30.773 回答