1

私のプロジェクトのコピーには、 HibernateGrailsPlugin.groovy に次のスニペットが含まれています。

def doWithDynamicMethods = {
        def dynamicMethods = HibernatePluginSupport.doWithDynamicMethods
        dynamicMethods.delegate = delegate
        dynamicMethods.call(it)

        // aids in generating appropriate documentation in plugin.xml since 
        // domain class methods are lazily loaded we initialize them here
        if(plugin.basePlugin) {
            try {
                def clz = application.classLoader.loadClass("org.grails.Behavior")
                clz.count()             
            }
            catch(e) {
                // ignore
            }
        }
    }

私は grails/groovy を初めて使用しますが、正しく理解していれば、このクロージャーは動的メソッドの追加/削除を HibernatePluginSupport クラスの doWithDynamicMethods クロージャーに委任しています。HibernatePluginSupport クラスは残りの grails 固有のコードでコンパイルされているようです。HibernatePluginSupport のコードがプロジェクトのプラグインのコピーに含まれていれば、必要に応じて簡単にカスタマイズできます。私の質問は、特定のクラスの自動生成されたメソッドをどのように変更するのですか? 私が見る唯一の方法は、groovy ファイルの doWithDynamicMethods クロージャーを書き直すことですが、一部のドメイン クラス用にカスタマイズしているだけなので、そうしたくありません。より具体的には、「HibernatePluginSupport.doWithDynamicMethods」クロージャーによって追加された動的メソッドを削除/置換するにはどうすればよいですか?

4

1 に答える 1

0

まず第一に、動的ファインダーは Groovy のメタプログラミング機能に基づいています。

HibernateGrailsPlugin.groovy を変更しないでください。このファイルは Grails Hibernate プラグインの一部であり、特定の Grails コマンドを実行するとオーバーライドされます。

アプリケーション内からいつでも Groovy オブジェクトのメタクラスを自由に変更できるため、

a) カスタムの動的ファインダー (Hibernate Grails プラグインに依存する) に潜入する独自の grails プラグインを作成する、または

b) メタクラスの変更を Bootstrap.groovy にスローして、アプリケーションの起動時に適用します

于 2011-04-14T11:30:36.990 に答える