运行时给java对象动态的属性赋值
运行时给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方法给文件对象内容赋值