例如,如果我执行修改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)
但这没有改变.
Java应该没有内存泄漏,但它仍然可能.当我的程序有内存泄漏时,我可以修复它(我希望).但是当一些第三方包装有它时我该怎么办?几乎没有什么,除了不使用这个包.
还有其他解决方案吗?我喜欢沙箱的想法.你被允许在某个区域内做任何你想做的事情而你"身体上"没有能力打扰你的盒子之外的其他人.有没有办法在Java中为内存使用创建这样的沙箱?想象一下=为内存使用创建沙箱,允许一些包做它做的任何事情,取结果并删除这个沙箱,里面留下任何垃圾!没有GC的并发症,没有清洁或处理内存.只需删除并忘记它.
有办法吗?