Groovy 如何测试bean属性是否可写?

Groovy 如何测试bean属性是否可写?,groovy,Groovy,目前,我正在使用以下代码检查是否可以设置bean属性 class Foo { def baz = 'baz' String getBar() { 'bar' } } def f = new Foo() assert f.hasProperty('baz').setter assert !f.hasProperty('bar').setter 我调用的getSetter()方法是在MetaBeanProperty上定义的,它是hasProperty返回的MetaPro

目前,我正在使用以下代码检查是否可以设置bean属性

class Foo {

  def baz = 'baz'

  String getBar() {
    'bar'
  }
}


def f = new Foo()
assert f.hasProperty('baz').setter
assert !f.hasProperty('bar').setter

我调用的
getSetter()
方法是在
MetaBeanProperty
上定义的,它是
hasProperty
返回的
MetaProperty
实例的运行时类型。我确信一定有更好的方法来检查bean属性是否可写,有什么建议吗?

我建议使用
respondsTo(“setX”)


我多次使用以下方法,似乎效果良好:

class Foo {
    String name

    private int _age
    private Date _dob

    void setAge(int age){ _age = age }

    Date getDateOfBirth(){ _dob }
}

boolean hasSetterFor(String propName){
    Foo.metaClass.methods.find { MetaMethod mm-> mm.name == "set${propName.capitalize()}" }    
}

println "Name: ${hasSetterFor('name')}"
println "Age : ${hasSetterFor('age')}"
println "DOB : ${hasSetterFor('dateOfBirth')}"

基本上,您正在寻找Groovy属性生成的隐式setter或开发人员编码的显式setter的存在。此外,您还可以根据需要进一步筛选公共、非静态方法的搜索。

在您的示例中,该属性既有getter,也有gettersetter@injecteer
bar
属性没有设置项,它有!如果它被定义为
private
@injecteer,它就不会有setter。我的测试表明您是incorrect@injecteer
baz
是一个具有getter和setter的属性,但
bar
不是。这是一个简单的方法。
class Foo {
    String name

    private int _age
    private Date _dob

    void setAge(int age){ _age = age }

    Date getDateOfBirth(){ _dob }
}

boolean hasSetterFor(String propName){
    Foo.metaClass.methods.find { MetaMethod mm-> mm.name == "set${propName.capitalize()}" }    
}

println "Name: ${hasSetterFor('name')}"
println "Age : ${hasSetterFor('age')}"
println "DOB : ${hasSetterFor('dateOfBirth')}"