Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate 如何从groovy反射(?)中获取域类值?_Hibernate_Grails_Reflection_Groovy - Fatal编程技术网

Hibernate 如何从groovy反射(?)中获取域类值?

Hibernate 如何从groovy反射(?)中获取域类值?,hibernate,grails,reflection,groovy,Hibernate,Grails,Reflection,Groovy,我想在一些插件上显示doWithDynamicMethod调用的persistentProperties值 通过下面的代码,我成功地截获了域类上的save和update方法,并在它们试图保存对象时查看它们的输出 但是我无法打印persistentProperties的内容(可能是因为我是groovy和grails的noob,因此我不熟悉groovy反射的语法) 有人能帮忙吗 以下是我的代码: def doWithDynamicMethods = { ctx -> // TODO Im

我想在一些插件上显示doWithDynamicMethod调用的persistentProperties值

通过下面的代码,我成功地截获了域类上的save和update方法,并在它们试图保存对象时查看它们的输出

但是我无法打印persistentProperties的内容(可能是因为我是groovy和grails的noob,因此我不熟悉groovy反射的语法)

有人能帮忙吗

以下是我的代码:

def doWithDynamicMethods = { ctx ->
   // TODO Implement registering dynamic methods to classes (optional)

   application.domainClasses.each { gc ->

      def domainClass = gc.clazz
      domainClass.metaClass.invokeMethod = { name, args ->

         if (name == 'save' || name == 'update')
            delegate.log.info " ${delegate.class.name}.$name() args: $args"

         new DefaultGrailsDomainClass(delegate.class).persistentProperties.each{ property -> 

            delegate.log.info "printing properties => "+ property.name+ "  "
         }//end persistentProperties.each                   

      }//endmetaClass.invokeMethod 
   } //end domainClasses.each
}//end doWithDynamicMethod

如果我了解您试图执行的操作,您的代码当前正在列出与域类本身关联的
persistentProperties
。要实际获取属性值,您需要传递属性名

例如,如果您具有以下域类:

class Book {
    String title
    String lang
}
如果您正在保存一本新的
书籍
,如下所示:

def b = new Book(title: 'Hemingway', lang: 'en-us').save()
您的代码应该打印出如下内容:

printing properties => title  
printing properties => lang
printing properties => Hemingway  
printing properties => en-us
如果您希望它打印如下内容:

printing properties => title  
printing properties => lang
printing properties => Hemingway  
printing properties => en-us
然后,您必须从obj本身访问该属性:

def doWithDynamicMethods = { ctx ->
    application.domainClasses.each { gc ->
        def domainClass = gc.clazz
        domainClass.metaClass.invokeMethod = { name, args ->
            def domainObj = delegate

            if (name == 'save' || name == 'update') {
                new DefaultGrailsDomainClass(domainObj.class).persistentProperties.toList().each { property ->
                    domainObj.log.info "printing properties => " + domainObj[property.name]
                }
            }

            def called = domainClass.metaClass.getMetaMethod(name, args)
            called?.invoke(domainObj, args)
        }
    }
}
还有一些其他问题。变量
delegate
对于每个闭包都是特殊的。如果您实际运行它,您可能没有看到“打印属性…”根本不需要记录消息,因为在调用
delegate.log.info
内部,每个
closure
delegate
都引用封闭类的闭包。另外,如果要从
domainObj
读取属性,则应确保它位于name if子句内部,否则将调用
i再次使用nvokeMethod


最后,您应该获取最初被调用的元方法并调用它,否则它实际上不会保存/更新。

Phoung,感谢您的帮助,我将代码更改为:
delegate.log.info“printing properties=>”+property.name+“”+delegate[property.name]
,它可以工作!