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 ...
随机推荐
- [转帖]好用的parallel命令
https://www.cnblogs.com/codelogs/p/16060043.html 原创:打码日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处. 简介# 有时,我们需要 ...
- Mark 一下 Redisson 可能需要升级版本
貌似有bug 我们高并发的情况下貌似遇到了 https://github.com/redisson/redisson/issues/2299
- 在WPF应用中,结合阿里矢量图标库使用Geometry图标
在我们的SqlSugar开发框架的WPF应端中,有时候我们需要在按钮或者其他界面元素上使用一些图标,框架中我们可以使用 lepoco/wpfui 项目的图标库,也可以使用Font-Awesome-WP ...
- ARC150D - Removing Gacha (树上期望)
Link 题意: 给一棵 \(n\) 个节点的树,称一个点是好的,当且仅当它到根的路径上都是黑色(包括自己).每次在不好的节点中随机选一个把它涂成黑色(不管原来它是否是白的),直到所有点都是好的为止. ...
- Ant Design Vue栅格Grid的使用
栅格系统的设计理念 建议横向排列的盒子数量最多四个,最少一个. 因此我们的span一般设置为3或者4 小屏幕的话就另当别论了 栅格系统的简单介绍 1.通过row在水平方向建立一组column(简写 c ...
- ClickHouse(22)ClickHouse集成HDFS表引擎详细解析
HDFS 这个引擎提供了与Apache Hadoop生态系统的集成,允许通过ClickHouse管理HDFS上的数据.这个引擎提供了Hadoop的特定功能. 用法 ENGINE = HDFS(URI, ...
- 解决Chrome翻译无法使用
截止2022年11月3日自己ping出的ip不可用了 可以用以下ip 172.217.215.90 172.253.115.90 142.250.126.90 142.250.10.90 142.25 ...
- 从零开始匹配vim(1)——选项设置
前面我们算是对 vimscript 做了一个入门,并且实现了一个 输出 hello world 的语句.现在我们继续进行 vimscript 的学习. set语句 之前在介绍 vim 基础的时候,我们 ...
- 微信小程序-页面生命周期
官方文档:https://developers.weixin.qq.com/miniprogram/dev/framework/app-service/page-life-cycle.html
- gym.spaces中找不到prng解决方案
gym.spaces中找不到prng解决方案 在运行飞桨MADDPG问题是遇到模型无法导入不存的的问题: ModuleNotFoundError: No module named 'multiagen ...