2

我正在编写一个 Groovy 脚本(作为 Grails 插件的一部分),并且我想获取我的插件用户可能定义的 GrailsDomainClass 的属性列表。我可以使用domainClass.properties(其中 domainClass 是GrailsDomainClass)来做到这一点。

但是,假设用户拥有 grails 域类:

class Example {
  String name

    static constraints = {
    }

  def getSomeNonExistingProperty(){
    return "Not-a-real-property"
  }
}

在这种情况下,domainClass.properties返回一个同时包含name和的列表someNoneExistingProperty

我知道这是因为 Grails 正在动态生成一个只读属性,以供有人使用 getBlah() 方法的地方使用。太好了,但是在我的脚本中,我只想使用“真实”属性(或至少非只读属性)执行一些操作。

也就是说,我想要一些区分或识别的方式someNonExistingProperty为只读属性,或者,作为由 Grails 生成的属性,而不是由我的插件用户明确输入为 domainClass 中的字段。

我查看了GrailsDomainClassProperty类,它有一系列方法提供有关属性的信息。但是,它们似乎都没有告诉我属性是否为只读,或者让我区分 domainClass 中定义的字段和 Grails 由于“getSomeNonExistingProperty”而即时创建的字段()“ 方法。

我在这里遗漏了一些明显的东西吗?有没有办法只获得明确的用户定义字段的列表(例如,在上面的例子中,名称)?

4

2 回答 2

1

我相信瞬态属性是您要排除的

于 2010-10-22T01:30:26.090 回答
0

我遇到过几次这个问题,而不是试图解决它,我通常只是重命名我的getX()方法。这可能是最简单的选择。

编辑: 或者,我想知道您是否可以使用反射来查看在类上定义了哪些方法,并在迭代您的属性时查看该属性是否定义了明确的 getter,然后将其省略。当谈到 Groovy 和 Grails 时,我对反射不是很熟悉,尤其是动态方法,但它是一种可能的调查途径。

于 2010-10-22T11:56:04.283 回答