java对象通过点运算符操作对象属性的方式没法使用for,while等循环,此工具主要解决这一问题.

例如:有一对象包含属性有一定规律

obj1: {

name1: "张三",

age1: 1,

name2: "李四",

age2: 2,

....

}

要将此对象拆为多个小对象

objList:[

{

name: "张三",

age: 1

},

{

name: "李四",

age: 2

}

]

为了应对这种不能使用循环获取属性的情况,编写了此工具类

核心实现代码如下:

/**

* @param o

* 操作对象

* @param methodName

* 方法名

* @param attName

* 属性名

* @param value

* 值

* @return get方法返回实际值 set方法返回操作后对象

*/

private static Object Operation(Object o, String methodName, String attName, Class> paramType, Object value) {

// 方法赋值出错标志

boolean opErr = false;

Object res = null;

Class> type = o.getClass();

try {

Method method = null;

if (methodName.indexOf("get") != -1) {

// get方法

// 获取方法

method = type.getMethod(methodName);

// 执行

res = method.invoke(o);

} else {

// set方法

// 当没有传入参数类型时通过value获取参数类型

paramType = paramType == null ? value.getClass() : paramType;

// 获取方法

method = type.getMethod(methodName, paramType);

// 执行

method.invoke(o, value);

res = o;

}

} catch (Exception e) {

// 通过get/set方法操作属性失败

opErr = true;

if (SHOW_LOG) {

System.err.println(getThisName() + ": [WARN] 直接对属性'" + attName + "进行操作(不借助get/set方法).");

}

}

if (opErr) {

// 通过打破封装方式直接对值进行操作

try {

Field field = null;

// 获取属性

field = type.getDeclaredField(attName);

// 打破封装

field.setAccessible(true);

if (methodName.indexOf("get") != -1) {

// get方法

// 获取属性值

res = field.get(o);

} else {

// set方法

// 设置属性值

field.set(o, value);

res = o;

}

} catch (Exception e) {

//两种方法都操作失败

if (SHOW_LOG) {

System.err.println(getThisName() + ": [ERROR] 属性'" + attName + "'操作失败.");

}

}

}

return res;

}

set方法如下:

/**

* 设置属性值

*

* @param o

* 操作对象

* @param attName

* 属性名

* @param value

* 参数值

* @param paramType

* 参数类型

* @return 操作后对象

*/

@SuppressWarnings("unchecked")

public static T set(T o, String attName, Object value, Class> paramType) {

if (o == null || attName == null || attName.isEmpty()) {

return null;

}

String methodName = attNameHandle("set", attName);

return (T) Operation(o, methodName, attName, paramType, value);

}

get方法如下:

/**

* 获取属性值

*

* @param o

* 操作对象

* @param attName

* 属性名

* @param returnType

* 返回值类型

* @return

*/

@SuppressWarnings("unchecked")

public static T get(Object o, String attName, Class returnType) {

if (o == null || attName == null || attName.isEmpty()) {

return null;

}

String methodName = attNameHandle("get", attName);

return (T) Operation(o, methodName, attName, null, null);

}

通过属性名获取get/set方法名:

/**

* 属性名处理

*

* @param method

* 方法(get/set)

* @param attName

* @return

*/

private static String attNameHandle(String method, String attName) {

StringBuffer res = new StringBuffer(method);

// 属性只有一个字母

if (attName.length() == 1) {

res.append(attName.toUpperCase());

} else {

// 属性包含两个字母及以上

char[] charArray = attName.toCharArray();

// 当前两个字符为小写时,将首字母转换为大写

if (Character.isLowerCase(charArray[0]) && Character.isLowerCase(charArray[1])) {

res.append(Character.toUpperCase(charArray[0]));

res.append(attName.substring(1));

} else {

res.append(attName);

}

}

return res.toString();

}

完整代码:https://github.com/GFuZan/reflexTools

java根据属性获取对象_java反射工具类--通过指定属性名,获取/设置对象属性值相关推荐

  1. java dateutil 获取时间戳_java DateUtil工具类时间戳类型转换详解

    本文实例为大家分享了DateUtil工具类时间戳类型转换的具体代码,供大家参考,具体内容如下 package com.sinosoft.media.sms.util; import java.text ...

  2. java文件读写的基本类_java常用工具类(三)—— 文件读取的操作类

    定义常用的文件类型 public class FileType { /** * 文件头类型 */ public static final String XML_FILE = "text/xm ...

  3. JAVA线程并发数量控制_Java并发工具类(三):控制并发线程数的Semaphore

    作用 Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源. 简介 Semaphore也是一个线程同步的辅助类,可以维护当前访问自身的线程个数 ...

  4. java 反射 接口工具类_Java 反射工具类 ReflectionUtils

    import lombok.extern.slf4j.Slf4j; import java.lang.reflect.*; /** * 反射的 Utils 函数集合 * 提供访问私有变量, 获取泛型类 ...

  5. java中拼接xml方法_Java常用工具类,拼接XML格式的字符串,非常好用

    import java.util.ArrayList; import java.util.Iterator; import java.util.LinkedHashMap; import java.u ...

  6. java qlv转mp4 代码_Java实用工具类五:URL转码、解码类

    package com.cn.hnust.util; import java.io.UnsupportedEncodingException; import java.util.HashMap; im ...

  7. java.lang.class对象_Java反射——java.lang.Class 类简介

    Java的基本思想之一是万事万物即对象,类也是一种对象.但是类是什么对象呢?Java中的类是java.lang.Class的实例化对象,这被成为类类型. //java.lang.Class类中的的主要 ...

  8. java构造方法 隐含三步_Java入门总结--------类和对象关系以及构造方法

    Java中重写父类的方法要遵循"两同两小一大"规则, "两同"即方法名相同.形参列表相同: "两小"指的是子类方法的返回值类型应比父类方法返 ...

  9. java 反射 本类_Java 反射 Class类

    Java 反射 Class类 @author ixenos 摘要:Class类在反射中的地位.构造Class对象的三种方式.Class对象构造对应类型对象的三种方式 Class类在反射中的地位 位于j ...

最新文章

  1. Linux下nginx+tomcat+memcached集群
  2. 【引用】如何关闭SELinux
  3. 【机器学习基础】浅谈为什么L2正则化有效
  4. html透明度_学好Web前端开发,必要了解的HTML+CSS的技巧有哪些
  5. qt qss设置字体大小_Qt编写自定义控件70-扁平化flatui
  6. php进程通讯方式,PHP进程模型、进程通讯方式、进程线程的区别分别有哪些?
  7. 充满含金量的一场云原生Meetup,入场券免费发送中……
  8. centos7 访问php页面显示源码_运维干货分享:centos7下源码编译安装php-7.1.5(脚本)...
  9. 【IntelliJ IDEA】idea导入项目只显示项目中的文件,不显示项目结构
  10. struts2的ActionSupport
  11. 阿里数据师最爱用的图表特效,10分钟让可视化报告内涵又炫酷
  12. 数据分析——如何构建数据指标体系
  13. matlab相反数计数,怎么把origin表格中的数改成相反数
  14. 读取XML文件时,总报“前言中不允许有内容”
  15. 更改C盘用户文件夹名
  16. 影创发布首款头手6DoF MR眼镜鸿鹄,搭载高通骁龙XR2平台
  17. Laravel 事件监听
  18. 图纸上标注的是实际尺寸吗_尺寸数字应该标注图纸上所画实际长度。
  19. [JZOJ 5804] 简单的序列
  20. 云原生CICD:Tekton之TaskTaskRun概念篇

热门文章

  1. 机器视觉-相机内参数和外参数
  2. 机器人如何在不断变化的世界中“找到”自己?
  3. 刷脸背后,卷积神经网络的数学原理原来是这样的
  4. 3D 视觉 相关知识-SLAM框架-常见方案对比
  5. 关于Spring中的context:annotation-config/配置(开启注解)
  6. IDEA下使用Jetty进行Debug模式调试【含演示GIF图】
  7. 部分 II. Network
  8. SpringCloud(第 002 篇)简单电影微服务类(消费方,而提供方为用户微服务)
  9. Linuxmingl
  10. java fx alert_javaFx:使用弹出对话框 Alert