不允许在groovy脚本中调用run()

不允许在groovy脚本中调用run(),groovy,scripting,infinite-loop,dsl,Groovy,Scripting,Infinite Loop,Dsl,我正在使用GroovyShell在JVM中运行Groovy脚本。GroovyShell使用了几个AST定制器和一些预定义的方法来定义DSL。但我发现hasard可以在任何groovy脚本中编写“run()”,使其在无限循环中运行 有人知道如何禁止在已经运行的脚本中调用“run()”吗 我试图重写脚本的invokeMethod,并设置一个标志,在脚本运行时禁用run方法。。。但是无论我做什么,我仍然可以在脚本中调用这个run()方法,似乎不需要经过脚本的invokeMethod 提前感谢您的帮助将

我正在使用GroovyShell在JVM中运行Groovy脚本。GroovyShell使用了几个AST定制器和一些预定义的方法来定义DSL。但我发现hasard可以在任何groovy脚本中编写“run()”,使其在无限循环中运行

有人知道如何禁止在已经运行的脚本中调用“run()”吗

我试图重写脚本的invokeMethod,并设置一个标志,在脚本运行时禁用run方法。。。但是无论我做什么,我仍然可以在脚本中调用这个run()方法,似乎不需要经过脚本的invokeMethod


提前感谢您的帮助

将这一行添加到您执行的每个脚本中:

this.metaClass.run { null }

谢谢你的回答。肯定会有用的。。。但是我不想修改脚本(这一行是闭包,我的DSL不允许)。我不允许使用上面的run(),并定义某种互斥,禁用脚本在运行时从自身运行的可能性,但仍然允许从已编译的java程序运行脚本。您的要求对我来说有点奇怪。您希望仅当run方法由非脚本本身的代码调用时才允许它吗?我可以想出几种方法来实现这一点,但这实际上取决于你是如何实现DSL的,它不可能是一种真正通用的方式(意味着你想要一个黑客)。你使用GroovyShell吗?如何使用?我在Java服务中使用GroovyShell来解析和运行脚本,这些脚本是按照我的DSL规则编写的。因此,这些脚本文件不是由服务编译和运行的,我认为这一点也不奇怪。我必须将这些文件中的代码可能性限制在DSL的很少几个关键字,以及它的语法(不需要run)。groovyshell解析其中一个文件以获得groovy.lang.Script对象,然后为脚本设置预定义绑定,并调用Script.run()(从服务中)。但是脚本可以通过直接调用此run方法来运行自己,即使它已经在运行。。。这导致了一个无限循环“我必须将这些文件中的代码可能性限制在DSL的极少数关键字上”-我认为这意味着您需要自己解析文本并将其转换为代码,否则,使用GroovyShell允许人们几乎使用任何Java/Groovy方法,包括
System.exit()
和类似的方法,使
run()
成为您的最小问题。