使用Groovy default imports任何脚本都可以访问java.{lang,util,io,net}.*
,groovy.{lang,util}.*
,java.math.BigInteger
和java.math.BigDecimal
而无需导入任何内容。
如果我不想要那个怎么办?
是否可以创建一个没有默认导入的GroovyShell
?
def importCustomizer = new ImportCustomizer()
// importCustomizer.clearImports() <-- I wish that would exist
def configuration = new CompilerConfiguration()
configuration.addCompilationCustomizers(importCustomizer)
def binding = new Binding("Date", "today")
def shell = new GroovyShell(binding, configuration)
println shell.evaluate("Date")
打印class java.util.Date
我希望使用绑定中的today
来获取Date
(这只是一个例子,灵感来自this recent question)。
使用CompilerConfiguration
和ImportCustomizer
,我只能添加更多导入,我不知道如何从干净的平板开始。
我也见过this answer(我刚刚修复了死链接),它指向where those default imports are defined,但我没有看到的方法删除导入,再次只是添加更多。
看起来我必须挂钩"Semantic Analysis" phase:
这包括解析类,静态导入和变量范围。
使用groovyConsole
确认:如果我在其中键入x=Date
,则使用&#34;脚本&#34;菜单→&#34;检查AST&#34;,工具显示:
x=Date
x = java.util.Date
在那个阶段,ResolveVisitor做了它的事情(使用默认导入),我还没有办法解决这个问题。