zoukankan      html  css  js  c++  java
  • 如何通过反射获取和设置对象私有字段的值?

    可以通过类对象的 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);

    }

    }

    }

  • 相关阅读:
    Python3 文件
    Python 字典
    Python OS
    Python函数zip-map
    Python 3.5 filter
    python3.5.2库getpass
    JavaScript学习四
    cocos creator学习
    JavaScript学习三
    JavaScript学习3
  • 原文地址:https://www.cnblogs.com/programb/p/13027297.html
Copyright © 2011-2022 走看看