groovy.lang.GroovyShell
在内部,它使用groovy.lang.GroovyClassLoader,这是在运行时编译和加载类的核心。
groovy.lang.GroovyClassLoader
通过使用GroovyClassLoader代替GroovyShell,您将能够加载类,而不是脚本实例
GroovyClassLoader保留对其创建的所有类的引用,因此很容易造成内存泄漏。特别是,如果您两次执行相同的脚本(如果它是一个字符串),那么您将获得两个不同的类!
原因: GroovyClassLoader不能跟踪源文本
如果要具有相同的实例,则源必须是文件 // 类名相同
def gcl = new GroovyClassLoader() def clazz1 = gcl.parseClass(file) def clazz2 = gcl.parseClass(new File(file.absolutePath)) assert clazz1.name == 'Foo' assert clazz2.name == 'Foo' assert clazz1 == clazz2