如何在执行GroovyShell后撤消元类更改?

cre*_*zel 10 groovy metaprogramming

例如,如果我执行修改String元类的Groovy脚本,则添加方法foo()

GroovyShell shell1 = new GroovyShell();
shell1.evaluate("String.metaClass.foo = {-> delegate.toUpperCase()}");
Run Code Online (Sandbox Code Playgroud)

当我在那之后创建一个新的shell并执行它时,更改仍然存在

GroovyShell shell2 = new GroovyShell();
Object result = shell2.evaluate("'a'.foo()");
Run Code Online (Sandbox Code Playgroud)

有没有办法在执行GroovyShell后撤消所有元类更改?我试过了

shell1.getClassLoader().clearCache();
Run Code Online (Sandbox Code Playgroud)

shell1.resetLoadedClasses();
Run Code Online (Sandbox Code Playgroud)

但这没有改变.

Chr*_*orf 12

您可以使用

GroovySystem.metaClassRegistry.removeMetaClass(String.class);
Run Code Online (Sandbox Code Playgroud)

还原对String元类所做的所有更改.

或者,您只能更改某个String实例的元类,因此不会影响所有String实例.