Groovy探索之对Java语言反射的简化
例如,我们使用Java语言反射最多的地方是在运行时对POJO对象或者Domain对象的“set”和“get”方法的调用,因为对象属性是私有的,获取和设置对象属性的值是通过对应的“get”和“set”方法进行的。下面是一个关于“get”方法调用的例子:
public
static
Object getFieldValue(Object bean,Field field)
{
try
{
String type = field.getType().getName();
{
return
m1.invoke(bean,
null
);
}
else
{
}
}
catch
(Exception e)
{
e.printstacktrace();
if
(
logger
.isDebugEnabled())
{
logger
.debug(
"getFieldValue"
,e);
}
return
null
;
}
}
整个过程相当的繁琐。
def
static
getFieldValue(Object bean,String fieldName)
{
bean.
"$fieldName"
}
class
Man
{
String name
String age
String addr
}
我们使用该类来进行测试:
Man man =
new
Man()
man.name =
'Mike'
man.age =
'22'
man.addr =
'Shenzhen'
println
getFieldValue(man,
'age'
)
打印结果为:
22
再做一个测试:
Man man =
new
Man()
man.name =
'Mike'
man.age =
'22'
man.addr =
'Shenzhen'
man.MetaClass.properties.
each
{
println
"property name: ${it.name},property value: ${man."
${it.name}
"}"
}
结果为:
property name: class,property value: class base.Man
property name: addr,property value: Shenzhen
property name: age,property value: 22
property name: name,property value: Mike
class
Man
{
String name
String age
String addr
public
String toString()
{
"$name is $age year old,and live in $addr"
}
}
Man man =
new
Man()
man.name =
'Mike'
man.age =
'22'
man.addr =
'Shenzhen'
def
functionName =
'toString'
println
man.
"${functionName}"
()
可以看到,与动态设置或获取属性值唯一不同的是在
Gstring
对象后面跟了一个“
()
”。在
Groovy
语言中,
Gstring
对象后面如果没有括号,表示调用的是属性;有括号表示调用的是方法。
println
man.
"${functionName}()"
则会抛出如下的Exception:
Exception in thread "main"
groovy.lang.MissingPropertyException
: No such property: toString() for class: base.Man
在“使用组合代替继承”口号越来越响亮的今天,委派技术将不可避免的越来越多的使用到。下面试着举出一个例子来说明。
class
Buyer
{
def
borrow4Car()
{
println
'borrow money for car'
}
def
borrow4House()
{
println
'borrow money for house'
}
}
class
Bank
{
def
borrowMoney(type)
{
Buyer buyer =
new
Buyer()
buyer.
"borrow4${type}"
()
}
}
buyer
向
bank
贷款,目的各不相同,有的是为了买车,有的是为了买房。如果
bank
要调查
buyer
贷款的目的,我们需要调用
Bank
类的“
borrowMoney
”方法,但
Bank
类本身不知道
buyer
贷款的目的,因此它需要将这个功能委派给
Buyer
类。
buyer.
"borrow4${type}"
()
下面来测试上面的代码:
Bank bank =
new
Bank()
bank.borrowMoney(
'Car'
)
打印结果为:
borrow money for car
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。