用反射写的取属性值和设置属性值得方法

 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);//得到属性值
28                         return value;
29                     } else {
30                         target = f.get(target);//修改target
31                     }
32                 } catch (Exception e) {
33                     throw new RuntimeException(e);
34                 }
35             }
36         }
37         return null;
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 }
时间: 2024-08-27 20:24:27

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

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

/// /// 获取类中的属性值 /// public string GetModelValue(string FieldName, object obj) { try { Type Ts = obj.GetType(); object o = Ts.GetProperty(FieldName).GetValue(obj, null); string Value = Convert.ToString(o); if (string.IsNullOrEmpty(Value)) return null

DOM元素属性值如果设置为对象

结论:内部会调用toString方法,将设置的对象转换为字符串添加给相应的属性: 这个问题呢,是通过jQuery的each方法中,回调函数的this指向问题而来: 我们知道,回调函数中的this如果指向的是基本数据类型,那么系统会自动将这个基本数据类型的值包装为对应的对象类型: 就比如: 数组里面存的是string类型的值,然后jq实例调用each方法,打印的this如下图所示: this指向的基本数据类型的值被转换为了String类型: 但是这里说的不是这个问题,而是和这个问题类似,我们在给D

java反射获取对象的属性值和对象属性中的子属性值

近段时间在做web项目,前端使用的是jQuery EasyUI. 为方便需要,准备做一个前端通用的Datagird导出Excel功能,博主也考虑过思路和最终功能,1.前端选中行导出:2.当前页导出:3.当前过滤条件导出. 想偷懒在网上找找已有的代码改改,发现大部分只能满足个别需求,使用JS导出只能满足前端,使用代码才能实现3功能. ...... 好了,说了一堆废话,回归正题,本文是在做通用自定义字段导出时所需要,根据属性名去查找对象和子对象,找到对应属性值,抓取回来放到Excel中. 直接上代码

[转] C#反射设置属性值和获取属性值

/// /// 获取类中的属性值 /// /// /// /// public string GetModelValue(string FieldName, object obj) { try { Type Ts = obj.GetType(); object o = Ts.GetProperty(FieldName).GetValue(obj, null); string Value = Convert.ToString(o); if (string.IsNullOrEmpty(Value))

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

/// /// 获取类中的属性值 /// /// /// /// public string GetModelValue(string FieldName, object obj) { try { Type Ts = obj.GetType(); object o = Ts.GetProperty(FieldName).GetValue(obj, null); string Value = Convert.ToString(o); if (string.IsNullOrEmpty(Value))

Java反射得到属性的值和设置属性的值

public static <T> void Model2Doc_childs(T t,Document reqData, Node parentNode) throws IllegalArgumentException, IllegalAccessException {            Class<?> clazz = t.getClass();        Field[] fields = clazz.getFields(); for (Field f : fields

利用反射获取字段并获取值或者设置值

package Reflect; import java.lang.reflect.Field;class User{ public String account; public String password;}class Student extends User{ public int age; public String name; private String sex; public Student() { System.out.println("调用无参构造器创建对象");

Python3基础 setattr 设置对象的属性值,如果属性不存在就创建一个

? python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 conda : 4.5.11 type setting : Markdown ? code """ @Author : 行初心 @Date : 18-9-23 @Blog : www.cnblogs.com/xingchuxin @GitHub : github.com/GratefulHeartCoder """ cl

C#通过属性名字符串获取、设置对象属性值

目录 #通过反射获取对象属性值并设置属性值 #获取对象的所有属性名称及类型 #判断对象是否包含某个属性 #通过反射获取对象属性值并设置属性值 0.定义一个类 public class User { public int Id { get; set; } public string Name { get; set; } public string Age { get; set; } } 1.通过属性名(字符串)获取对象属性值 User u = new User(); u.Name = "lily&