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 ...
随机推荐
- [转帖]一次 Java 进程 OOM 的排查分析(glibc 篇)
https://juejin.cn/post/6854573220733911048 遇到了一个 glibc 导致的内存回收问题,查找原因和实验的的过程是比较有意思的,主要会涉及到下面这些: Linu ...
- [转帖]【JVM】JDK命令行工具
在JDK/bin目录下我发现了许多命令行工具 这些命令有哪些作用呢,接下来我就来详细介绍一下 常用JDK命令行工具 命令名称 全称 用途 jstat JVM Statistics Monitoring ...
- Nginx的Keepalive的简单学习
摘要 最近发现某项目的Nginx负载服务器上面有很多Time_wait的TCP连接 可以使用命令 netstat -n |awk '/^tcp/ {++S[$NF]} END{for (a in S) ...
- elementui-自定表头和在input中遇见的问题
第一个问题:无法关闭 弹出框 <el-table :data="tableData" style="width: 100%"> <el-tab ...
- 深度学习应用篇-计算机视觉-目标检测[4]:综述、边界框bounding box、锚框(Anchor box)、交并比、非极大值抑制NMS、SoftNMS
深度学习应用篇-计算机视觉-目标检测[4]:综述.边界框bounding box.锚框(Anchor box).交并比.非极大值抑制NMS.SoftNMS 1.目标检测综述 对计算机而言,能够&quo ...
- C/C++ MinHook 库的使用技巧
在上面的各种Hook挂钩方式中,我们都是在手写封装代码,但这样的方式并不高效,真正的生产环境中我们必须使用现成的Hook库,常用的Hook库有免费开源的MinHook和商业的Detours Hook, ...
- 19.2 显式加载/隐式加载--《Windows核心编程》
部分笔记来自于:https://blog.csdn.net/blade1080/article/details/81364161 注:关于DLL存放位置,一般是放到可执行文件的目录下. 下面时加载程序 ...
- HBase相关面试题汇总
1.HBase是什么? (1) HBase一个分布式的基于列式存储的数据库,基于Hadoop的hdfs存储,zookeeper进行管理. (2) HBase适合存储半结构化或非结构化数据,对于数据结构 ...
- [Maven]关于Maven的生命周期与命令
关于Maven的生命周期与命令 工作的时候对Maven的install和package的使用产生了一些疑问,干脆将Maven的整个生命周期都复习总结一遍. 先看下在IDEA中Maven的生命周期节点: ...
- 基于keras的文本情感识别
情感识别是一个典型的分类问题,可以使用Keras来实现,本文是之前整理的笔记,分享出来大家一起学习. 流程描述 Keras文本情感分类基于机器学习算法,会根据大量数据训练出分类模型,然后使用训练好 ...