运行时给java对象动态的属性赋值
如何给java对象动态的属性赋值(也就是在代码执行的时候才决定给哪个属性赋值)
1.自定义一个工具类ReflectHelper,代码如下所示:
package
com.bxsurvey.process.util;
import
java.lang.reflect.Method;
import
java.util.Hashtable;
import
java.util.regex.Pattern;
/**
* @desc 通过反射来动态调用get 和 set 方法
*/
public
class
ReflectHelper {
private
Class cls;
/**
* 传过来的对象
*/
private
Object obj;
private
Hashtable<String, Method> getMethods =
null
;
private
Hashtable<String, Method> setMethods =
null
;
public
ReflectHelper(Object o) {
obj = o;
initMethods();
}
public
void
initMethods() {
getMethods =
new
Hashtable<String, Method>();
setMethods =
new
Hashtable<String, Method>();
cls = obj.getClass();
Method[] methods = cls.getMethods();
// 定义正则表达式,从方法中过滤出getter / setter 函数.
String gs =
"get(\\w+)"
;
Pattern getM = Pattern.compile(gs);
String ss =
"set(\\w+)"
;
Pattern setM = Pattern.compile(ss);
// 把方法中的"set" 或者 "get" 去掉,$1匹配第一个
String rapl =
"$1"
;
String param;
for
(
int
i =
0
; i < methods.length; ++i) {
Method m = methods[i];
String methodName = m.getName();
if
(Pattern.matches(gs, methodName)) {
param = getM.matcher(methodName).replaceAll(rapl).toLowerCase();
getMethods.put(param, m);
}
else
if
(Pattern.matches(ss, methodName)) {
param = setM.matcher(methodName).replaceAll(rapl).toLowerCase();
setMethods.put(param, m);
}
else
{
// org.jeecgframework.core.util.LogUtil.info(methodName + " 不是getter,setter方法!");
}
}
}
public
boolean
setMethodValue(String property,Object object) {
Method m = setMethods.get(property.toLowerCase());
if
(m !=
null
) {
try
{
// 调用目标类的setter函数
m.invoke(obj, object);
return
true
;
}
catch
(Exception ex) {
ex.printStackTrace();
return
false
;
}
}
return
false
;
}
}
2.用法,假如现在要Person类中的name属性赋值
ReflectHelper reflectHelper =
new
ReflectHelper(
new
Person());
//创建工具类对象
reflectHelper.setMethodValue(
"name"
,
"值"
);
// 动态调用 set方法给文件对象内容赋值