• 运行时给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方法给文件对象内容赋值
  • 相关阅读:
    灾备架构图
    Dashboard有什么用
    第一次使用Docker的完整过程
    网页端的消息接收方式
    我理解中的应用架构
    数字化转型模型
    工业4.0的下一个十年
    一文读懂华为全屋智能一文读懂华为全屋智能
    支付总架构解析
    spring boot:shardingsphere+druid整合seata分布式事务(spring boot 2.3.3)
  • 原文地址:https://www.cnblogs.com/chinaifae/p/10190012.html
Copyright © 2020-2023  润新知