2

有一个应用程序,用户可以在其中提供自定义 groovy 脚本。他们可以在这些脚本中编写自己的函数。我想限制人们在这些脚本中使用“同步”关键字以及其他一些关键字。例如,应该不可能编写如下所示的函数。

public synchronized void test() {
}

我正在创建一个 CompilerConfiguration 并使用SecureASTCustomizer。但是,将 org.codehaus.groovy.syntax.Types.KEYWORD_SYNCHRONIZED 添加到黑名单令牌列表中似乎并没有完成这项工作。(如果我添加 org.codehaus.groovy.syntax.Types.PLUS 它会阻止在脚本中使用“+”..但似乎并没有完成同步的工作)

关于如何实现这一目标的任何想法......

4

1 回答 1

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' } }
'''

这个想法是创建一个编译定制器来检查生成的类,并且对于每个方法,如果存在同步修饰符,则添加一个错误。对于方法内部的同步块,您可以使用SecureASTCustomizer自定义语句检查器。

于 2013-04-05T13:24:59.037 回答