1 package com.lovo.util;
 2
 3 import java.lang.reflect.Constructor;
 4 import java.lang.reflect.Field;
 5
 6 public class MyUtil {
 7     private MyUtil(){
 8         throw new AssertionError();
 9     }
10     /**
11      * 通过反射获取对象的字段值
12      * @param target 目标对象
13      * @param fieldName 字段名称
14      * @return 字段的值或null
15      */
16     public static Object getValue(Object target,String fieldName) {
17         Object value = null;
18         //用"."分割例如:"car.engine"表示target对象的(Car类型)car属性的(Engine)engine属性值
19         String[] strs = fieldName.split("\\.");
20         for (int i = 0; i < strs.length; i++) {
21             if (target != null) {
22                 try {
23                     Class<?> clazz = target.getClass();//得到target对象类的类类型对象(描述target对象类的类对象)
24                     Field f = clazz.getDeclaredField(strs[i]);//得到属性
25                     f.setAccessible(true);
26                     if (i == strs.length - 1) {
27                         value = f.get(target);//得到属性值29                     } else {
30                         target = f.get(target);//修改target
31                     }
32                 } catch (Exception e) {
33                     throw new RuntimeException(e);
34                 }
35             }
36         }
37         return value;
38     }
39     /**
40      * 设置属性值
41      * @param target 目标对象
42      * @param fieldName 属性
43      * @param value 值
44      */
45     public static void setValue(Object target,String fieldName,Object value) {
46         Class<?> clazz = target.getClass();
47         String[] trs = fieldName.split("\\.");
48         for (int i = 0; i < trs.length - 1; i++) {
49             try {
50                 Field f = clazz.getDeclaredField(trs[i]);
51                 f.setAccessible(true);
52 //                Object tempTarget = target;
53 //                target = f.get(target);
54                 if (f.get(target) == null) {
55                     String type = f.getGenericType().toString();//得到值为null的属性的类型的字符串
56                     String[] typeSplits = type.split(" ");
57                     clazz = Class.forName(typeSplits[1]);//得到值为null的属性的类型的类类型对象
58                     Constructor<?> con = clazz.getDeclaredConstructor();//得到属性的无参构造器
59                     con.setAccessible(true); //有可能是private的所以设置可以访问
60                     f.set(target, con.newInstance());//给null属性赋值
61                 }
62                 target = f.get(target);
63                 clazz = target.getClass();
64
65             } catch (Exception e) {
66                 e.printStackTrace();
67                 throw new RuntimeException();
68             }
69         }
70         try {
71             Field f = clazz.getDeclaredField(trs[trs.length - 1]);
72             f.setAccessible(true);
73             f.set(target, value);
74
75         } catch (Exception e) {
76             throw new RuntimeException();
77         }
78     }
79 }

转载于:https://www.cnblogs.com/f644135318/p/4148559.html

用反射写的取属性值和设置属性值得方法相关推荐

  1. DOM—操作元素(获取属性值、设置属性值、 移除属性)

    1. 自定义属性的操作 1.1 获取属性值 element . 属性     获取属性值:(元素本身自带的属性) element . getAttribute( ' 属性 ' ):(主要获取自定义的属 ...

  2. java 获取属性值和设置属性值

    /*** 获取属性值* @param obj* @param property* @return*/public static Object getObjProVal(Object obj, Stri ...

  3. JavaScript原生态获取DOM对象,获取属性值以及设置属性值

    一.获取DOM对象(标签,元素,节点)的三种方法 1.document.getElementById();   根据元素的id获取当前的标签 例如 <p id="demo"& ...

  4. JAVA 通过属性名称 获取属性值、设置属性值

    import java.lang.reflect.Field; import java.lang.reflect.Method;/*** 获取对象指定属性的值* @param o 对象* @param ...

  5. java报错误设置属性值_java – 设置属性值时出错;嵌套异常是org.springframework.beans.NotWritablePropertyException:...

    我试图使用Spring实用程序ResultSetExtractor从MySQL数据库获取数据,但我得到以下异常: Exception in thread "main" org.sp ...

  6. php中align标签属性值,html align属性是什么含义?html中的align属性设置方法介绍

    html align属性是什么含义?html中的align属性设置方法介绍都在这里,本篇文章介绍了html align属性的定义和含义,还有关于html align属性值的设置介绍 html alig ...

  7. html clear属性值,clear属性有哪些属性值 CSS clear属性的理解.

    CSS clear是什么属性... 语法: clear : none | left |right | both 参数: none : 允许两边都可以有浮动对象 both : 不允许有浮动对象 left ...

  8. C#反射设置属性值和获取属性值

    /// /// 获取类中的属性值/// /// /// /// public string GetModelValue(string FieldName, object obj){try{Type T ...

  9. css属性和属性值,溢出属性,css盒子

    1.css属性和属性值 1.css文本属性 1. font-size 字体大小 单位是px,浏览器默认的是16px,设计图常用的是12px 2. font-family 字体 当字体是中文字体,英文字 ...

最新文章

  1. 百度地图与所托瑞安达成深度合作 共同推进商用车安全智能驾驶领域创新
  2. python与正则表达式(part8)--compile对象及match对象的属性方法
  3. mysql优化器分析器_MySQL查询优化器的概念和原理整个执行过程
  4. vbs打开软件光标停在第一个输入框_三维设计软件,3DMAX最全快捷键大全,赶快收藏哦...
  5. linux网络编程之用一张图片说明函数inet_ntop、inet_pton、inet_addr、inet_ntoa 、inet_aton函数之间的关系
  6. 一对一 一对多 多对多
  7. mybatis配置文件祥解(mybatis.xml)
  8. 从Jetty、Tomcat和Mina中提炼NIO构架网络服务器的经典模式
  9. 消息队列技术—获取JMS中文版和英文版API
  10. java接口测试工具_接口模拟测试利器,moco server工具的介绍
  11. 电商数据应用体系建设总结(二)—— 数据应用层架构介绍和规范总结
  12. 移远BC35-GBC28BC95调试 步骤:从上电到发送一个http请求收到响应
  13. 8.1.CentOS7安装Spark安装部署及standalone模式介绍
  14. qr码生成_在PHP中生成QR码
  15. 雷顿学院大数据一期课程免费下载
  16. python应用题应用背景及实际意义_课题研究的现实背景及意义
  17. Chapter 1 (Linear Equations in Linear Algebra): System of linear equations (线性方程组)
  18. 22条经典心灵鸡汤集锦
  19. Office.Interop.Excel引用失败
  20. Ubuntu 12.04 更改 lightdm 登陆界面背景图

热门文章

  1. Linux系统MySQL开启远程连接
  2. HDU 2859 Phalanx (dp)
  3. cocos2dX改变锚点位置
  4. let const —— ES6基础总结(二)
  5. 带你全面了解QinQ
  6. hdu4932 Miaomiao#39;s Geometry (BestCoder Round #4 枚举)
  7. SCM-SVN集成服务器
  8. 如何创建圆角 UITextField 与内阴影
  9. Android 圆角Button
  10. php Imagick()扩展,实现将原图截取成不同规格尺寸的图片