Groovy 如何测试bean属性是否可写?
目前,我正在使用以下代码检查是否可以设置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
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@injecteerbaz
是一个具有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')}"