Java 通过属性名称读取或者设置实体的属性值
原因
项目实战中有这个需求,数据库中配置对应的实体和属性名称,在代码中通过属性名称获取实体的对应的属性值。
解决方案
工具类,下面这个工具是辅助获取属性值
import com.alibaba.fastjson.JSONObject;
public class StringUtil {
/**
* 对象转成json字符串
*
* @param obj
* @return
*/
public static String toJson(Object obj) {
return JSONObject.toJSONString(obj);
} /**
* 对象转成JSONObject
*
* @param obj
* @return
*/
public static JSONObject toJsonObject(Object obj) {
return JSONObject.parseObject(toJson(obj));
} /**
* 获取对象的指定字段的值
*
* @param obj
* @param propName
* @return
*/
public static String getPropValue(Object obj, String propName){
String propValue = StringConst.EMPTY;
try {
if(null!=obj) {
JSONObject jsonObject = toJsonObject(obj);
if (!StringUtil.isEmptyOrNull(propName)) {
propValue = jsonObject.getString(propName);
}
}
} catch (Exception e) {
log.error(e.getMessage());
}
return propValue;
}
}
下面这个是提供给接口使用的读取设置属性值的工具类
/**
* @Description: 读取指定实体类的指定属性字段值
*/
public class TableUtil {
/**
* 通过propName传进来的值,判断从哪个表取值
*
* @param obj 当前使用的实体
* @param propName 表名.列名;表名.列名
* @return
*/
public String getValue(Object obj, String propName) {
StringBuilder stringBuilder = new StringBuilder(StringConst.EMPTY);
List<String> props = Arrays.stream(StringUtil.ifEmptyOrNullReturnValue(propName).split(";")).collect(Collectors.toList());
for (String prop : props) {
String temp = null;
List<String> tableNames = Arrays.stream(StringUtil.ifEmptyOrNullReturnValue(prop).split("\\.")).collect(Collectors.toList());
// 表名.列名,数据库中配置的是实体名称+属性名称
if (tableNames.size() > 1) {
// 表名
String tableName = tableNames.get(0);
// 列名
String colName = tableNames.get(1);
if ("special".equalsIgnoreCase(tableName)) {// 如果需要对一些实体进行特殊处理,比如说某些实体从缓存读取,或者某个实体中的属性值需要特殊处理,就可以在下面增加特殊处理逻辑
temp = StringUtil.getPropValue(specialModel, colName);
} else {
temp = StringUtil.getPropValue(obj, colName);
}
} else if (tableNames.size() > 0) {// 数据库中只配置了属性名称,说明只有某个实体才会用到该记录,到时候获取属性值的时候记得把obj传进来
// 列名
String colName = tableNames.get(0);
if (colName.contains("?")) {//特殊处理数据库中配置的三目运算符
// 如:sheathProtector=="有"?0:1
String tempColName = colName.split("\\?")[0].split("==")[0].trim();
String tempColValue = colName.split("\\?")[0].split("==")[1].replace("\"", "").replace("'", "").trim();
String tempValue = StringUtil.getPropValue(obj, tempColName);
if (tempValue.equals(tempColValue)) {
temp = colName.split("\\?")[1].split(":")[0];
} else {
temp = colName.split("\\?")[1].split(":")[1];
}
} else {
temp = StringUtil.getPropValue(obj, colName);
}
}
}
String result = stringBuilder.toString();
return result;
} /**
* 为实体赋值
*
* @param obj
* @param propName
* @param value
* @return
*/
public Object setValue(Object obj, String propName, String value) {
try {
Field f = obj.getClass().getDeclaredField(propName);
f.setAccessible(true);
f.set(obj, value);
} catch (Exception e) {
return null;
}
return obj;
} }
使用
TableUtil tableUtil;
public void test(){
Person p = new Person();
String age = tableUtile.getValue(p,"age");// 读取属性值
tableUtil.setValue(p,"age",23);// 设置属性值
}
Java 通过属性名称读取或者设置实体的属性值的更多相关文章
- C#反射技术的简单操作(读取和设置类的属性)
public class A { public int Property1 { get; set; } } static void Main(){ A aa = new A(); Type type ...
- C#反射读取和设置类的属性
C#反射技术的简单操作(读取和设置类的属性) http://www.cnblogs.com/william-lin/archive/2013/06/05/3118233.html 泛型方法通过反射创建 ...
- C#反射技术的简单操作(读取和设置类的属性、属性值)
public class A { public int Property1 { get; set; } } static void Main(){ A aa = new A(); Type type ...
- 通过id设置的css属性和通过元素设置的css属性冲突了,优先级哪个高?
---恢复内容开始--- <!DOCTYPE html> <html> <head> <title>div test</title> < ...
- Java读取利用java.util类Properties读取resource下的properties属性文件
说明:upload.properties属性文件在resources下 import java.io.IOException;import java.io.InputStream;import jav ...
- 把两个object对象合并成一个对象 属性名称相同的变为后面对象的值
object.assign(from,obj)------object.assign(目标对象,被合并的对象)
- java 中利用反射机制获取和设置实体类的属性值
摘要: 在java编程中,我们经常不知道传入自己方法中的实体类中到底有哪些方法,或者,我们需要根据用户传入的不同的属性来给对象设置不同的属性值,那么,java自带的反射机制可以很方便的达到这种目的,同 ...
- C#通过属性名称获取(读取)属性值的方法
之前在开发一个程序,希望能够通过属性名称读取出属性值,但是由于那时候不熟悉反射,所以并没有找到合适的方法,做了不少的重复性工作啊! 然后今天我再上网找了找,被我找到了,跟大家分享一下. 其实原理并不复 ...
- dom4j读取某个元素的某个属性
一.dom4j介绍 dom4j是一个Java的XML API,类似于jdom,用来读写XML文件的.dom4j是一个非常非常优秀的Java XML API,具有性能优异.功能强大和极端易用使用的特点, ...
- Android SystemProperties设置/取得系统属性的用法总结
通过调查得知,Android系统中取得/设置系统属性的用法参考以下3篇文章就足够了. 1.Android SystemProperties简介 介绍了设置属性需要的权限,已经设置权限的方法. Syst ...
随机推荐
- [转帖]并发控制- sched_yield 函数
函数说明 函数原型 #include <sched.h> int sched_yield(void); 1 2 sched_yield的作用是让出处理器,调用时会导致当前线程放弃CPU,进 ...
- [转帖]Unixbench服务器综合性能测试方法及工具下载
UnixBench是一款开源的测试 unix 系统基本性能的工具,是比较通用的测试VPS性能的工具. UnixBench会执行一系列的测试,包括2D和3D图形系统的性能衡量,测试的结果不仅仅只是CPU ...
- Sysbench的简单学习-编译与安装
sysbench的简单学习-编译与安装 摘要 github上面获取一下最新版本 https://github.com/akopytov/sysbench 注意现在 2023.2.17 最新版是 sys ...
- Python 潮流周刊#12:Python 中如何调试死锁问题?
查看全文: https://pythoncat.top/posts/2023-07-22-weekly 文章&教程 1.使用 PyStack 调试 Python 中的崩溃和死锁 (英) 2.介 ...
- 深度学习应用篇-计算机视觉-目标检测[4]:综述、边界框bounding box、锚框(Anchor box)、交并比、非极大值抑制NMS、SoftNMS
深度学习应用篇-计算机视觉-目标检测[4]:综述.边界框bounding box.锚框(Anchor box).交并比.非极大值抑制NMS.SoftNMS 1.目标检测综述 对计算机而言,能够&quo ...
- 【四】多智能体强化学习(MARL)近年研究概览 {Learning cooperation(协作学习)、Agents modeling agents(智能体建模)}
相关文章: [一]最新多智能体强化学习方法[总结] [二]最新多智能体强化学习文章如何查阅{顶会:AAAI. ICML } [三]多智能体强化学习(MARL)近年研究概览 {Analysis of e ...
- 机器学习算法(四): 基于支持向量机的分类预测(SVM)
机器学习算法(四): 基于支持向量机的分类预测 本项目链接:https://www.heywhale.com/home/column/64141d6b1c8c8b518ba97dcc 1.相关流程 支 ...
- 4.0 Python 变量与作用域
在python中,变量的作用域决定了变量在哪些位置可以被访问.一个程序中的变量并不是所有的地方都可以访问的,其访问权限决定于变量的赋值位置.python中有两种最基本的变量作用域:局部作用域和全局作用 ...
- C/C++ 文件与指针操作笔记
创建临时文件 #include <stdio.h> int main(int argc, char *argv[]) { FILE *temp; char c; if ((temp = t ...
- Star 4.2k,这是我用过最舒服的跨平台Redis桌面客户端
项目介绍 Tiny RDM 一个现代化轻量级的跨平台Redis桌面客户端,支持Mac.Windows和Linux 软件截图 运行效果 版本展示 配置连接 项目亮点 极致轻量 极小包体,随处安装随处使用 ...