Reflection Grails/Groovy-域对象-属性映射

Reflection Grails/Groovy-域对象-属性映射,reflection,grails,groovy,dns,metaprogramming,Reflection,Grails,Groovy,Dns,Metaprogramming,如何在我的一个域对象上仅获取用户定义属性的键/值的映射 问题是,若我自己这么做,我会得到我的属性加上类、元类、约束、闭包等 我假设Grails可以相当容易地做到这一点,因为它是在脚手架代码的某个级别上完成的,对吗?我自己怎么做呢?试试这个 class Person{ String name String address } def filtered = ['class', 'active', 'metaClass'] def alex = new Person(name:'a

如何在我的一个域对象上仅获取用户定义属性的键/值的映射

问题是,若我自己这么做,我会得到我的属性加上类、元类、约束、闭包等

我假设Grails可以相当容易地做到这一点,因为它是在脚手架代码的某个级别上完成的,对吗?我自己怎么做呢?

试试这个

class Person{
    String name
    String address
}

def filtered = ['class', 'active', 'metaClass']

def alex = new Person(name:'alex', address:'my home')

def props = alex.properties.collect{it}.findAll{!filtered.contains(it.key)}

props.each{
    println it
}

如果您使用
alex.metaClass.nam姓氏='soke'
,它也可以工作。此属性将显示在每个循环中

这是一个老问题,但我刚刚遇到了此要求,并发现对于遇到此线程的其他人来说,这是值得回答的。我根据这条线索总结了一个例子:

样本Bean

class SampleBean {

    long id
    private String firstName
    String lastName
    def email

    Map asMap() {
        this.class.declaredFields.findAll { !it.synthetic }.collectEntries {
            [ (it.name):this."$it.name" ]
        }
    }
}
测试类

class Test {

    static main(args) {
        // test bean properties
        SampleBean sb = new SampleBean(1,'john','doe','jd@gmail.com')

        println sb.asMap()
    }

}
SampleBean
我放置了各种字段来显示它的工作原理,这是println的输出:

[id:1, firstName:john, lastName:doe, email:jd@gmail.com]

我认为最好的方法是在域对象上使用.properties来获取grails中字段的映射,在Grails2.1中进行了测试

class Person{
String firstName
String lastName

} 
def person=new Person()
person.firstName="spider"
person.lastName="man"
def personMap=person.properties 

这就是你想要的吗?这正是我要建议的。显然,您必须小心处理瞬态属性。这适用于普通groovy类,但对于grails域对象来说并不那么整洁,因为grails域对象周围有额外的魔法,可以打印出来。这适用于普通groovy类,但对于grails域对象来说并不那么整洁,因为grails域对象周围有额外的魔法,可以打印出来。问题是只返回用户定义的属性-
person。属性
将返回的不仅仅是用户定义的属性。