• 如何通过反射获取和设置对象私有字段的值?


    可以通过类对象的 getDeclaredField()方法字段(Field)对象,然后再通过字段

    对象的 setAccessible(true)将其设置为可以访问,接下来就可以通过 get/set 方

    法来获取/设置字段的值了。下面的代码实现了一个反射的工具类,其中的两个静

    态方法分别用于获取和设置私有字段的值,字段可以是基本类型也可以是对象类

    型且支持多级对象操作,例如 ReflectionUtil.get(dog, “owner.car.engine.id”);

    可以获得 dog 对象的主人的汽车的引擎的 ID 号。

    import java.lang.reflect.Constructor;

    import java.lang.reflect.Field;

    import java.lang.reflect.Modifier;

    import java.util.ArrayList;import java.util.List;

    /**

    * 反射工具类

    * @author 骆昊

    *

    */

    public class ReflectionUtil {

    private ReflectionUtil() {

    throw new AssertionError();

    }

    /**

    * 通过反射取对象指定字段(属性)的值

    * @param target 目标对象

    * @param fieldName 字段的名字

    * @throws 如果取不到对象指定字段的值则抛出异常

    * @return 字段的值

    */

    public static Object getValue(Object target, String fieldName) {

    Class<?> clazz = target.getClass();

    String[] fs = fieldName.split("\.");

    try {

    for(int i = 0; i < fs.length - 1; i++) {

    Field f = clazz.getDeclaredField(fs[i]);

    f.setAccessible(true);

    target = f.get(target);

    clazz = target.getClass();

    }

    Field f = clazz.getDeclaredField(fs[fs.length - 1]);

    f.setAccessible(true);

    return f.get(target);

    }

    catch (Exception e) {

    throw new RuntimeException(e);

    }

    }

    /**

    * 通过反射给对象的指定字段赋值

    * @param target 目标对象

    * @param fieldName 字段的名称

    * @param value 值

    */

    public static void setValue(Object target, String fieldName, Object

    value) {

    Class<?> clazz = target.getClass();

    String[] fs = fieldName.split("\.");

    try {

    for(int i = 0; i < fs.length - 1; i++) {

    Field f = clazz.getDeclaredField(fs[i]);

    f.setAccessible(true);

    Object val = f.get(target);

    if(val == null) {

    Constructor<?> c =

    f.getType().getDeclaredConstructor();

    c.setAccessible(true);

    val = c.newInstance();

    f.set(target, val);

    }

    target = val;

    clazz = target.getClass();

    }

    Field f = clazz.getDeclaredField(fs[fs.length - 1]);

    f.setAccessible(true);

    f.set(target, value);

    }

    catch (Exception e) {

    throw new RuntimeException(e);

    }

    }

    }

  • 相关阅读:
    awk,seq,xarg实例使用
    Docker安装yapi
    基于阿里搭载htppd访问
    锐捷结课作业
    基于centos7搭建kvm
    基于django实现简易版的图书管理系统
    python 自定义log模块
    Interesting Finds: 2008.01.13
    Interesting Finds: 2008.01.24
    Interesting Finds: 2008.01.17
  • 原文地址:https://www.cnblogs.com/programb/p/13027297.html
Copyright © 2020-2023  润新知