2015-12-21 60 views
2

目前我使用下面的代码来检查,如果bean的属性可以设置我该如何测试一个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属性是否可写,有什么建议吗?

+0

在你的例子中属性有getter和setter – injecteer

+0

@injecteer'bar'属性没有setter –

+0

是的,它的确如此!如果它被定义为'private',它就不会有一个setter。 – injecteer

回答

2

我建议使用respondsTo("setX")

class Foo { 

    def baz = 'baz' 

    String getBar() { 
    'bar' 
    } 
} 

foo = new Foo() 

assert !foo.respondsTo('setBar') 
assert foo.respondsTo('setBaz') 
0

我用下面的方法很多时间,它似乎运作良好:

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或由开发人员编码的显式设置器。此外,您可以根据需要进一步过滤搜索公共非静态方法。

相关问题