例如,如果我执行一个Groovy脚本,该脚本修改了字符串元类,则添加一个foo()方法
GroovyShell shell1 = new GroovyShell();
shell1.evaluate("String.metaClass.foo = {-> delegate.toUpperCase()}");当我在那之后创建一个新的shell并执行它时,更改仍然存在
GroovyShell shell2 = new GroovyShell();
Object result = shell2.evaluate("'a'.foo()");有没有一种方法可以在执行GroovyShell后撤消所有元类更改?我试过了
shell1.getClassLoader().clearCache();和
shell1.resetLoadedClasses();但这并没有改变。
发布于 2009-10-28 17:53:02
您可以使用
GroovySystem.metaClassRegistry.removeMetaClass(String.class);还原对字符串元类所做的所有更改。
或者,您可以只更改某个String实例的元类,因此并不是所有的String实例都会受到影响。
发布于 2016-02-12 22:22:32
您也可以使用MetaClassRegistryCleaner。
在进行一些元类更改之前,您可以这样做
MetaClassRegistryCleaner registryCleaner = MetaClassRegistryCleaner.createAndRegister()
GroovySystem.metaClassRegistry.addMetaClassRegistryChangeEventListener(registryCleaner)当您想要将元类更改重置为它们之前的状态时。
你可以做到
registryCleaner.clean()
GroovySystem.metaClassRegistry.removeMetaClassRegistryChangeEventListener(registryCleaner)通过这种方式,您可以重置在持续时间内所做的所有元类更改。
发布于 2012-03-15 05:16:15
我意识到这是一个有点老的问题,但这是我在搜索完全相同的问题时在Google上得到的第一个结果。
我选择的解决方案是将groovy放到一个新的类加载器中(通过使用plexus),这样当脚本完成时,类加载器就会被释放(因此对元类的任何更改也会被释放)。
https://stackoverflow.com/questions/1612569
复制相似问题