Javassist:重新创建一个类 – 先删除,还是解冻()并修改?
我使用Javassist创建一个类。 在测试套件中,当第二个测试尝试创建相同的类时,它在pool.makeClass( ... )
处失败,因为该类被冻结(即已经通过toClass()
创建。
克服这个问题的方法是什么? 理想情况下,第一个测试应该以某种方式删除类 – 也许从类加载器中卸载 – 但是当我在JLS中读取时 ,卸载操作是不可靠的。
因此,或许解决方法是检查创建代码的类是否存在,如果存在,则defrost()
它,删除所有成员等,然后重新创建它。
还有其他想法吗?
或者是否有一些通过Javassist删除类的可靠方法?
您无法从ClassLoader
卸载单个类。 如果一个类及其ClassLoader
变得无法访问,则可以卸载ClassLoader
但由于每个类都引用其加载器,这意味着此加载器加载的所有类也必须变得无法访问。
但是您可以使用不同的ClassLoader
(重新)创建ClassLoader
。 好吧,正式地说它是一个具有相同名称(可能是相同的字节代码)的不同类。 如果在测试用例中执行的代码在堆中没有引用,则可以在测试之后收集ClassLoader
及其类。
我得到了同样的问题,我这样解决了,可能无法申请你的测试用例:
使CtClass成为类的私有静态变量。
创建一个方法来检查是否已构建CtClass。 如果没有构建CtClass,则调用构建它的方法,否则返回该CtClass。
使所有测试都使用新方法。
所以,如果你有N测试,只有第一个将尝试构建CtClass,其余的将具有静态CtClass变量。