有一个应用程序,用户可以提供自定义groovy脚本。他们可以在这些脚本中编写自己的函数。我想限制人们在这些脚本中使用'synchronized'关键字以及其他一些关键字。例如,不应该编写如下函数。
public synchronized void test() {
}
我正在使用SecureASTCustomizer创建CompilerConfiguration。但是,将org.codehaus.groovy.syntax.Types.KEYWORD_SYNCHRONIZED添加到黑名单标记列表中似乎不起作用。 (如果我添加org.codehaus.groovy.syntax.Types.PLUS它会阻止在脚本中使用'+'但似乎没有为同步做的工作)
关于如何实现这一目标的任何想法......
答案 0 :(得分:5)
您可以这样做:
import org.codehaus.groovy.control.CompilerConfiguration
import org.codehaus.groovy.syntax.SyntaxException
import org.codehaus.groovy.ast.ClassNode
import org.codehaus.groovy.control.SourceUnit
import org.codehaus.groovy.classgen.GeneratorContext
class SynchronizedRemover extends org.codehaus.groovy.control.customizers.CompilationCustomizer {
SynchronizedRemover() {
super(org.codehaus.groovy.control.CompilePhase.CONVERSION)
}
void call(final SourceUnit source, final GeneratorContext context, final ClassNode classNode) {
classNode.methods.each { mn ->
if (mn.modifiers & 0x0020) { // 0x0020 is for synchronized
source.addError(new SyntaxException("Synchronized is not allowed", mn.lineNumber, mn.columnNumber))
}
}
}
}
def config = new CompilerConfiguration()
config.addCompilationCustomizers(new SynchronizedRemover())
def shell = new GroovyShell(config)
shell.evaluate '''
class Foo { public synchronized void foo() { println 'bar' } }
'''
这个想法是创建一个编译定制器来检查生成的类,并且对于每个方法,如果存在synchronized修饰符,则添加错误。对于synchronized块内部方法,您可以将SecureASTCustomizer
与自定义语句检查器一起使用。