zoukankan      html  css  js  c++  java
  • 用反射操作数据

      通过反射设置数据,获取数据。代码如下示例。

    import java.lang.reflect.Constructor;
    import java.lang.reflect.Field;
    import java.lang.reflect.InvocationTargetException;
    
    /**
     * 工具类
     * Created by doudou on 2018/1/19.
     */
    public class ReflectionUtil {
    
        private ReflectionUtil() {
            throw new AssertionError();
        }
    
        /**
         * 通过反射取对象指定字段(属性)的值
         * @param target 目标对象
         * @param fieldName 字段的名字
         * @return  字段的值
         */
        public static Object getValue(Object target, String fieldName) {
            Class<?> clazz = target.getClass();
            String[] fields = fieldName.split("\.");
    
            try {
                for (int i = 0; i < fields.length - 1; i++) {
                    Field field = clazz.getDeclaredField(fields[i]);
                    field.setAccessible(true);
                    target = field.get(target);
                    clazz = target.getClass();
                }
                Field field = clazz.getDeclaredField(fields[fields.length - 1]);
                field.setAccessible(true);
                return field.get(target);
            } catch (NoSuchFieldException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
            return null;
        }
    
        public static Object setValue(Object target, String fieldName) {
            Class<?> clazz = target.getClass();
            String[] fields = fieldName.split("\.");
            try {
                for (int i = 0; i < fields.length - 1; i++) {
                    Field field = clazz.getDeclaredField(fields[i]);
                    field.setAccessible(true);
                    Object value = field.get(target);
                    if (value == null) {
                        Constructor<?> c = field.getType().getDeclaredConstructor();
                        c.setAccessible(true);
                        value = c.newInstance();
                        field.set(target, value);
                    }
                    target = value;
                    clazz = target.getClass();
                    Field f = clazz.getDeclaredField(fields[fields.length - 1]);
                    f.setAccessible(true);
                    f.set(target, value);
                }
            } catch (NoSuchFieldException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            } catch (InstantiationException e) {
                e.printStackTrace();
            }
            return null;
        }
    }
  • 相关阅读:
    BZOJ 2142: 礼物
    八校联考前3场记录
    BZOJ1115:[POI2009]石子游戏Kam (博弈论)
    IE10、IE11解决不能播放Flash的问题!
    ClientAbortException 异常解决办法
    WeX5学习笔记-建立项目且从SVN获取版本
    WeX5学习笔记-创建本地APP相关问题
    android 常见分辨率(mdpi、hdpi 、xhdpi、xxhdpi )屏幕适配
    ERROR 1130 (HY000):Host'localhost'解决方法
    一台机器运行多个JBoss 4.2.3多实例,或多个同一版
  • 原文地址:https://www.cnblogs.com/xinlichai0813/p/8317218.html
Copyright © 2011-2022 走看看