运行时给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方法给文件对象内容赋值运行时给java对象动态的属性赋值的更多相关文章
- 使用C#表达式树为两个对象的相同属性赋值
//缓存表达式树 private static Dictionary<string, object> objCache = new Dictionary<string, object ...
- java对象生成随意属性值
public class RandomObjectValue { public static <T> T getObject(Class<?> clazz) { T t = n ...
- JS-给对象动态添加属性
var obj = {};//用来存放获取到所填写的信息 btn.onclick = function(){ var city = input_city.value; var num = input_ ...
- js对象动态添加属性,方法
1. 动态添加属性,方法 var object = new Object(); object.name = "name"; object.age = 19; >>> ...
- 将对象a的属性赋值给对象b
BeanUtils.copyProperties(a,b); 将a的属性赋值给b(ab的共同属性)
- js为Object对象动态添加属性和值 eval c.k c[k]
const appendInfo = () => { const API_SECRET_KEY = 'https://github.com/dyq086/wepy-mall/tree/maste ...
- Java对象依次取出属性,并去掉特殊字符
工作里从数据库往前台调数据的时候,庞大的数据量里难免有些字段里包含空格或者一些特殊字符,在前台显示出来会非常不美观,所以在此记录一个去对象内所有属性特殊字符的方法: //获得该对象属性的集合 Fiel ...
- java对象的方法属性和代码块的加载顺序
1.静态变量 2.静态代码块 3.局部代码块 4.构造函数 5.普通代码块 6.静态方法 7.普通方法 8.普通属性 for example: package com.JavaTest2; publi ...
- FastJson只序列化java对象的部分属性
public class Student { private int id; private String name; private int age; //get set方法略 } 如下方法: St ...
随机推荐
- HDU-1237- 简单计算器--栈的基本应用
简单计算器 Problem Description 读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值. Input 测试输入包含若干测试用例,每个测试用例占一行,每行不 ...
- linux下解决find 1000/gfs无权限
用find查找根目录下的文件时,比如sudo find . -name \*test,就会出现1000/gfs无权限的情况 用一下方法可以正常使用 sudo find . -name test 2&g ...
- evpp 上传文件问题转
背景 因为项目需求,需要使用360的evpp库,来实现一个接口,支持文件上传. 实际操作过程中,发现了一些问题,记录下来. 前端文件上传方式 简单的使用input标签 <body> < ...
- Python离线断网情况下安装numpy、pandas和matplotlib等常用第三方包
联网情况下在命令终端CMD中输入“pip install numpy”即可自动安装,pandas和matplotlib同理一样方法进行自动安装. 工作的电脑不能上外网,所以不能通过直接输入pip命令来 ...
- Promise原理实现
首先先看一下 promise 的调用方式: // 实例化 Promise: new MyPromise((resolve, reject) => { setTimeout(() => { ...
- 安装pytest
1.安装pytest 2.执行一个用例 进入测试用例目录下,运行以test开头的一个用例. 执行成功. 备注:1.其实测试函数或方法只要以test开头就可以被运行的2.测试文件的名字,其实可以是任意的 ...
- machine learning(12) -- classification: One-vs-all classfication
Multiclass classification例子: 邮箱的邮件的分类: 工作邮件,私人邮件,朋友的邮件,兴趣爱好的邮件 医学诊断: 没有生病,患有流感,患有普通感冒 天气: 晴天,兩,多云等 O ...
- WebService操作
webservice是一种服务器通信技术,封装了socket.
- 重载new和delete运算符
内存管理运算符 new.new[].delete 和 delete[] 也可以进行重载,其重载形式既可以是类的成员函数,也可以是全局函数.一般情况下,内建的内存管理运算符就够用了,只有在需要自己管理内 ...
- Pycharm 的常用快捷键
pycharm常用快捷键 1.编辑(Editing) Ctrl + Space 基本的代码完成(类.方法.属性) Ctrl + Alt + Space 快速导入任意类 Ctrl + Shift ...