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 ...
随机推荐
- Redis scan等命令的学习与研究
Redis scan等命令的学习与研究 摘要 背景跟前几天说的一个问题类似. 为了验证自己的设想, 所以晚上继续写脚本进行了一轮次的验证. 不过上次讨论时,打击好像都没听懂我说的 所以这次准备从基础开 ...
- [转帖]linux时间戳转换成时间指令_时间戳转换公式
原文地址:http://wanping.blogbus.com/logs/28663569.html 1.时间戳转换为正常显示的时间格式 Freebsd 系统下: 转换命令为: date -r 111 ...
- uni-app 计算属性 computed
功能:=>大于1000用kg表示 小于1000,用g表示 计算属性 计算属性必须是有一个返回值的哦 在html写被计算的值 在computed中去直接调用哈 <view> <t ...
- 使用Git 命令行拉取、提交、推送、合并 代码
1.拉取 1.1.拉取该分支的最新代码(远程分支是与当前分支相同) git pull origin updateCode 1.2.拉取最新代码(远程分支是与当前分支不相同,但要合并) git pull ...
- 从 WebStorm 转到 VSCode!使用一周体验报告
前言 最近我的 Jetbrains 开源项目授权到期了,想要续订的时候发现 Jetbrains 提高了开源项目申请门槛,我的 StarBlog 项目因为名字里包含 blog 这个词无法申请,虽然我在 ...
- webpack与其常见loader加载器使用方式
webpack是什么 webpack是前端项目工程化的具体解决方案. 主要功能:提供了友好的前端模块化开发支持,支持代码压缩混淆(去除空格和注释,让文件体积更小),处理浏览器端JS的兼容性(将箭头函数 ...
- 苹果iOS 17正式版来了:iPhone X/8系列等机型无缘
据媒体报道,苹果会在9月13日凌晨1点发布iPhone 15系列新品,该机出厂预装iOS 17正式版系统. 在iPhone 15系列之后,苹果会向老机型推送iOS 17正式版更新.据爆料,苹果将会在9 ...
- navicat破解(15以前的版本)
navicat破解各种不成功,很耽误事.所以,再次整理一个相对省事有效的办法.内容如下: 一:下载此激活工具 二:按下图生成激活码 1. 2. 点击手动激活 3. 将请求码按图粘贴,按图点击操作便可激 ...
- 小知识:grep过滤以#号开头的注释行 和 空行
xtts的配置文件,有很多注释不想直接去掉的情况下,想清楚的看到目前设置了哪些参数,可以用grep过滤查看: grep -vE '^#|^$' xtt.properties 效果如下: [oracle ...
- 记录一则因主机名讹误导致的RAC启动异常
1.故障现象 2.解决方案 环境:RHEL 7 + Oracle 19.5 RAC 1.故障现象 最近遇到客户的一套19c测试环境,在一次主机重启后发现集群无法启动,使用crsctl stat res ...