zoukankan      html  css  js  c++  java
  • 运行时给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方法给文件对象内容赋值
  • 相关阅读:
    用代码说话:如何正确启动线程
    我的2019——菜鸟互联网找实习和工作记录
    Python网络爬虫——Appuim+夜神模拟器爬取得到APP课程数据
    用代码说话:如何在Java中实现线程
    用代码说话:synchronized关键字和多线程访问同步方法的7种情况
    RabbitMQ(四):使用Docker构建RabbitMQ高可用负载均衡集群
    RabbitMQ(三):RabbitMQ与Spring Boot简单整合
    RabbitMQ(二):RabbitMQ高级特性
    RabbitMQ(一):RabbitMQ快速入门
    使用Docker部署Spring Boot项目
  • 原文地址:https://www.cnblogs.com/chinaifae/p/10190012.html
Copyright © 2011-2022 走看看