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 ...
随机推荐
- [转帖]SkyWalking集成logback
1.引入skywalking的jar包,导入的包和agent版本一致 <dependency> <groupId>org.apache.skywalking</group ...
- [转帖]关于gdb相关的几个工具的说明
https://phpor.net/blog/post/846 使用rpm命名查看gdb的rpm包,主要由下面几个程序:/usr/bin/gcore/usr/bin/gdb/usr/bin/gdbse ...
- 使用 inotifywait的方式监控文件夹发生变化后自动执行脚本的方法
0. 先安装inotify 最简单的方法为: yum install epel-release 安装扩展包源 yum install inotify-tools 1. 从网上抄了一下脚本 简单记录一下 ...
- 查找linux下面某目录下重名出现的文件以及次数
find . -name '*.data' -exec basename {} \;| sort | uniq -w32 --all-repeated=separate | uniq -c | sor ...
- typeScript类型别名
类型别名 类型别名:是可以给一个类型起一个新的名字 采用关键字 type 例如 type Name=string|number type strType=string|number|boolean; ...
- 【小实验】golang的if比较中的string/[]byte转换会被编译器优化
之前做了实验,[]byte类型使用string()进行转换的时候,会产生拷贝.see: [小测试]golang中使用string()来转换[]byte数组产生了拷贝 不过今天又有了新的认识.请先看下面 ...
- TienChin 活动管理-修改活动
后端 ChannelController.java @PreAuthorize("hasPermission('tienchin:channel:edit')") @GetMapp ...
- net8来了
11 月 15 日开始的为期三天的 .NET Conf 在线活动的开幕日上,.NET 8作为微软的开源跨平台开发平台正式发布..NET 团队着重强调云.性能.全栈 Blazor.AI 和 .NET M ...
- 【三】强化学习之PaddlePaddlle-Notebook、&pdb、ipdb 调试---及PARL框架
相关文章: [一]飞桨paddle[GPU.CPU]安装以及环境配置+python入门教学 [二]-Parl基础命令 [三]-Notebook.&pdb.ipdb 调试 [四]-强化学习入门简 ...
- P4402 [Cerc2007] robotic sort 机械排序题解
题目链接:[Cerc2007] robotic sort 机械排序 前置知识点:文艺平衡树 具体的我们会将序号下标作为平衡树的键值,这样一来每个节点其实就是数组中的每个位置,又因为这个位置是具有有序性 ...