如何在运行时向Grails域对象添加动态方法而不创建插件?
在ref文档中,我只找到了如下示例如何在运行时向Grails域对象添加动态方法而不创建插件?,grails,grails-plugin,Grails,Grails Plugin,在ref文档中,我只找到了如下示例 class ExamplePlugin { def doWithDynamicMethods = { applicationContext -> application.controllerClasses.each { controllerClass -> controllerClass.metaClass.myNewMethod = {-> println "hello world" }
class ExamplePlugin {
def doWithDynamicMethods = { applicationContext ->
application.controllerClasses.each { controllerClass ->
controllerClass.metaClass.myNewMethod = {-> println "hello world" }
}
}
}
但是我不想为这样的代码创建插件…你不必这么做。您的示例的最里面一行是必需的。假设你有
SomeDomain
作为一个班级。你能行
SomeDomain.metaClass.newMethod = {-> // stuff }
现在我要去核实一下……;)
编辑--我已经验证过了。只需在命令行的GroovyShell中键入以下内容
class Example {}; Example.metaClass.newMethod = {-> println 'hello'}; def e = new Example(); e.newMethod()
您可以在init闭包中的grails app/conf/BootStrap.groovy文件中添加动态方法,然后它们应该在应用程序启动时可用
请注意,以这种方式添加的动态方法在单元测试中不可用。它们将在集成测试和运行时可用。这种方法需要做的一件事是在BootStrap.groovy中添加“def grailsApplication”作为依赖项注入,以便访问工件。然后可以调用“grailsApplication.controllerClasses.each…”