运行时给java对象动态的属性赋值

摘要:
包com.bxsurvey.process.util;cls=obj.getClass();方法[]方法=cls.getMethods();PatternetM=模式编译(gs);i<
运行时给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对象动态的属性赋值》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇服务器架设:CentOS搭建LNMP详细教程(转)微信公众平台开发教程(二) 基本原理及消息接口下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Unity3d与android通信

                                                   Unity3d与android通信                                                                                                           @广州小...

c#原理:c#代码是怎么运行的、实例化时发生了什么、静态对象(类、方法、变量、属性)的原理

c#代码是怎么运行的:  c#代码=》编译器=》DLL/EXE=>CLR/JIT=>机器码 最后到二进制的时候是这么执行的??? 要知道更具体细节,可以参考书籍《CLR VIA C#》 C#基础篇之C#和 .Net框架的概念和运行原理 深度理解C# 的执行原理 CPU(中央处理器) - 百度百科   转自:c#编译后是怎么运行的 1..NET语...

python的接口和抽象类

抽象基类有些面向对象的语言,如JAVA,支持接口,可以声明一个支持给定的一些方法方法,或者支持给定存取协议的类。抽象基类(或者ABCs)是Python里一个相同的特性。抽象基类由abc模块构成,包含了一个叫做ABCMeta的metaclass。这个metaclass由内置的isinstance()和issubclass()特别处理,并包含一批会被Pytho...

C# DllImport 方法,出现 The system cannot find the file specified 错误

最近使用 C# 调用 dll 中的 UpdateDriverForPlugAndPlayDevices() 方法去安装驱动,遇到了 “The system cannot find the file specified” 问题, 看着错误提示,是指系统没有找到指定文件,但是我检查硬盘,该文件确实存在,但是因为我测试时使用的是 Hebrew 希伯来语的系统,我...

pytest 1.简单介绍一,安装和如何运行

一、pytest是一个接口测试框架,试用版起来比较轻便灵活。首先来介绍他的安装: 直接使用命令 : pip install -U pytest 通过命令 :pytest --version  来查看版本信息 二、首先来创建第一个简单的demo,可以在pycharm里面创建,并且运行,运行只需要配置一下就可以 # content of test_1.py d...

chromium截图实现

声明:本blog是我自己写的,假设要转载,请注明:come from blog of niba! chromium终于显示是在ContentView上。但通过硬件加速。渲染合成的网页之前是在surfaceview上的。 所以。实现chromium的截图能够通过SufraceView的截图去实现。   自己创建一个SurfaceView的子类,例如以下:...