Groovy スクリプトの実装方法を少し変更しようとしています。コマンドラインから実行したいのですが、同じスクリプト内からさまざまなメソッドを呼び出して (それらをグループ化するために)、自動ドキュメンテーション システムも必要です。
次のようなスクリプトを実行しようとしています。
@Doc("これはテストスクリプトです") public testScript( @Doc("Param 1 はオプションです") String param1="nobody" ) { println "こんにちは" +param1 }
これに名前が付けられている場合は、「script」と言って、コマンドラインから「script testScript」または「script testScript world」と言ってそのメソッドを実行できます。"script --help" を使用すると、@Doc 注釈を使用して画面に使用状況が表示されます。
私が使用したいと考えているトリックは、スクリプトの基本クラスを指定する Groovy の機能です。-b Base を使用すると、子の「実行」メソッドが実行される前に Base のコンストラクターを実行できます。
この時点で、すぐに「実行」される呼び出しをインターセプトする必要がありますが、その方法がわかりません。何を試しても、expandoMetaClass、invokeMethod は、子の run() メソッドへの呼び出しをインターセプトしません。(invokeMethodには「継承」を行う方法があったと思いますが、main(..で実行するにはセットアップが必要でした..そしてスクリプトにはそれらの1つがありません)。
スクリプトを起動するためにバッチファイルまたは他のクラスを使用することをコミットした場合、これは簡単ですが、コマンドラインにこれ以上何も追加したくありません (-b Base を環境変数に入れることを期待しているので、スクリプトcli に期待するとおりに実行されます)。
これは私の基本クラスの例です...
抽象クラス Base extends Script implement GroovyInterceptable { 公開ベース() { println "これは実行されます" assert(this.class.name == "script") // 子スクリプトのインスタンスです def metaClass = this.class.getMetaClass() // スクリプトのメタである必要があります metaClass.run = this.&myRun // これはうまくいくと思います } def myRun() { println "呼び出されませんでしたが、スクリプトは Base() が返された後に実行されます" } }