美文网首页
动态匹配对象的属性、值

动态匹配对象的属性、值

作者: 周六不算加班 | 来源:发表于2019-10-08 16:50 被阅读0次

使用场景:
在读取出kv键值对时,可以直接给对象复制

1、ReflectHelper工具类

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、程序中调用

QxdmsSurfTietazhanDm5d q = new QxdmsSurfTietazhanDm5d();
ReflectHelper reflectHelper = new ReflectHelper(q);
String name = attribute.getName();
String value = element_sub.attributeValue(name);
String nameLowerCase = name.toUpperCase();
reflectHelper.setMethodValue(name,value);

相关文章

网友评论

      本文标题:动态匹配对象的属性、值

      本文链接:https://www.haomeiwen.com/subject/uzqisctx.html