2015-12-21 91 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或由開發人員編碼的顯式設置器。此外,您可以根據需要進一步過濾搜索公共非靜態方法。

相關問題