我正在尝试稍微改变我的 groovy 脚本的实现方式。我仍然希望它们从命令行运行,但我真的很想允许从同一个脚本中调用不同的方法(对它们进行分组),我还想要一个自动文档系统。
我正在尝试运行这样的脚本:
@Doc("这是一个测试脚本") 公共测试脚本( @Doc("参数 1 是可选的") String param1="nobody" ) { println "你好"+param1 }
如果它被命名,说“脚本”,我可以通过在命令行中说:“脚本 testScript”或“脚本 testScript world”来运行该方法。如果您使用“script --help”,您将使用@Doc 注释在屏幕上显示使用情况。
我希望使用的技巧是 Groovy 为脚本指定基类的能力。如果我使用 -b Base 我可以在执行孩子的“运行”方法之前运行 Base 的构造函数。
在这一点上,我需要拦截即将“运行”的呼叫,但我不知道该怎么做。无论我尝试什么,expandoMetaClass、invokeMethod,它们都不会拦截对孩子的 run() 方法的调用。(我相信 invokeMethod 有一些方法可以做“继承”,但它需要一个设置才能在 main() 中运行..而脚本没有其中之一)。
如果我承诺使用批处理文件或其他类来启动脚本,这将是微不足道的,但我真的不想在命令行中添加更多内容(我希望将 -b Base 放在环境变量中以便脚本仍会像您对 cli 的期望一样运行)。
这是我的基类的一个例子......
抽象类 Base 扩展脚本实现 GroovyInterceptable { 公共基础(){ println "执行完毕" assert(this.class.name == "script") // 它是子脚本的一个实例 def metaClass = this.class.getMetaClass() // 应该是脚本的元 metaClass.run = this.&myRun // 我相信这应该可以工作 } 定义我的运行() { println "从未调用,但脚本在 Base() 返回后运行" } }