zoukankan      html  css  js  c++  java
  • 通过反射获取某个对象下的属性值,或通过父类获取

    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import java.lang.reflect.Field;
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    import java.util.*;
    
    /**
     * 通过反射获取某个对象下的属性值,或通过父类获取
     * User: wangyongfei
     * Date: 2016/8/10
     * Time: 9:56
     */
    public class TestObjectRef {
    
        private static final Logger LOGGER = LoggerFactory.getLogger(TestObjectRef.class);
    
        /**
         * 对象相同
         * 对象属性name相同
         * @param list
         */
        public static Object object2Fields(List<Object>list,Object targetObject, String filteFieldName){
            for(Object sourceObject: list){
                Object rtnVal =  getObjectProprityValue(sourceObject, targetObject, filteFieldName);
                if(rtnVal == null){
                    continue;
                }
                return rtnVal;
            }
            return null;
        }
    
    
        /**
         * 如果当前类查找不到,则从父类属性中查找
         * @param object 当前类
         * @param filteFieldName 查找字段
         * @return
         */
        public static Object getSupperClassPropertity(Object object,String filteFieldName){
            Class<?>clazz = object.getClass();
            if(clazz != null && clazz.getGenericSuperclass()!=null){
                Class claSupper = clazz.getSuperclass();
                return getProperty(claSupper, object,filteFieldName);
            }
            return null;
        }
    
        /**
         * 过滤父类中字段
         * @param _class
         * @param bean
         * @param filteFieldName
         * @return
         */
        private static Object getProperty(Class _class, Object bean, String filteFieldName) {
            Object obj = null;
            Field[] fields = _class.getDeclaredFields();
            //private调整为public
            Field.setAccessible(fields, true);
            for (int i = 0; i < fields.length; i++) {
                Field field = fields[i];
                if (filteFieldName.equals(field.getName())) {
                    try {
                        obj = field.get(bean);
                    } catch (IllegalArgumentException e) {
                        LOGGER.error(e.getMessage());
                    } catch (IllegalAccessException e) {
                        LOGGER.error(e.getMessage());
                    }
                    break;
                }
            }
            if (obj == null && _class.getGenericSuperclass() != null) {
                obj = getProperty(_class.getSuperclass(), bean, filteFieldName);
            }
            return obj;
        }
    
    
    
        /**
         * 获取过滤对象对应属性值
         *  // TODO: 2016/8/10  集合类型处理 list, map等 --待完善,目前已满足需求
         * @param sourceObject 数据源对象
         * @param targetObject 过滤目标对象
         * @param filteFieldName 过滤目标对象对应熟悉字段
         * @return
         */
        private static Object  getObjectProprityValue(Object sourceObject, Object targetObject, String filteFieldName)  {
    
            if(sourceObject == null || sourceObject.getClass() == null || filteFieldName == null || "".equalsIgnoreCase(filteFieldName)){
                return null;
            }
            Boolean flag = sameObjectInstance(sourceObject, targetObject);
            Field[] fields = sourceObject.getClass().getDeclaredFields();
            for(Field field: fields){
                String str = field.getName();
                Method m = null;
                try {
                    m = sourceObject.getClass().getMethod("get" + str.substring(0, 1).toUpperCase()+""+str.substring(1, str.length()));
                    try {
                        Object object = m.invoke(sourceObject);
                        if (!flag && validProperityType(field.getType().getName())) {//不是同一对象且类型为class,则继续迭代
                            Object rtnVal = getObjectProprityValue(object, targetObject, filteFieldName);
                            if(rtnVal == null){
                                continue;
                            }
                            return rtnVal;
                        } else {
                            if(flag){
                                if(filteFieldName.equalsIgnoreCase(field.getName())){
                                    return object;
                                }
                            }
                            continue;
                        }
    
                    } catch (IllegalAccessException e) {
                        LOGGER.info("对象转换处理异常, e:{}", e.getMessage());
                    } catch (InvocationTargetException e) {
                        LOGGER.info("对象转换处理异常, e:{}", e.getMessage());
                    }
                } catch (NoSuchMethodException e) {
                    LOGGER.info("没有找到对应方法, e:{}", e.getMessage());
                }
            }
    
            //如果没找到,则从父类中查找
            if(flag){
                return  getSupperClassPropertity(sourceObject,filteFieldName);
            }
            return null;
        }
    
        /**
         * 校验两个对象是否属于同一对象实例
         * @param sourceObject
         * @param targetObject
         * @return
         */
        public static Boolean sameObjectInstance(Object sourceObject, Object targetObject){
    
            if(sourceObject == null || targetObject == null) return Boolean.FALSE;
            if(sourceObject.getClass().getName().equals(((Class) targetObject).getName())){
                return Boolean.TRUE;
            }
            return Boolean.FALSE;
        }
    
        /**
         * 类型校验方法
         * 1.以后如果出现特殊类型,在此方法中追加过滤即可
         * 2.目前只区分类与普通属性
         * 3.如果有特殊逻辑,可根据具体需要扩展此方法
         * @param type 类型值
         * @return
         */
        public static Boolean validProperityType(String type){
    
            if (type.equals("java.lang.String")) {
                return Boolean.FALSE;
            }
            if (type.equals("java.lang.Integer") || type.equals("int")) {
                return Boolean.FALSE;
            }
            if (type.equals("java.lang.Short")) {
                return Boolean.FALSE;
            }
            if (type.equals("java.lang.Double") || type.equals("double")) {
                return Boolean.FALSE;
            }
            if (type.equals("java.lang.Boolean") ||  type.equals("boolean")) {
                return Boolean.FALSE;
            }
            if (type.equals("java.util.Date")) {
                return Boolean.FALSE;
            }
            if (type.equals("java.util.List")) {
                return Boolean.FALSE;
            }
            if (type.equals("java.lang.Long") || type.equals("long")) {
                return Boolean.FALSE;
            }
            return Boolean.TRUE;
        }
    
        public static Map<String, String> templateFormat(
                Map<String, List<String>> hashMap,
                Object... object) {
    
            if(hashMap == null || hashMap.size() <=0 ){
                return null;
            }
            List<Object>list = new ArrayList<>();
            Collections.addAll(list, object);
            Map<String, String> map = new HashMap<>();
            for(String key: hashMap.keySet()){
                try {
                    Class<?> classType = Class.forName(key);
                    for(String str: hashMap.get(key)) {
                        System.out.println(str+":" + object2Fields(list, classType, str));
                    }
                } catch (ClassNotFoundException e) {
                    LOGGER.warn("[模板格式转换]类查询异常,error:{}", e.getMessage());
                }
            }
    
            return  null;
        }
    }
    

      

  • 相关阅读:
    电话线路使用的带通虑波器的宽带为3KHz (300~3300Hz),根据奈奎斯特采样定理,最小采样频率应为(16)。
    总线宽度为32bit,时钟频率为200MHz,若总线上每5个时钟周期传送一个32bit的字,则该总线的带宽为 (4) MB/S。
    安全需求可划分为物理安全、网络安全、系统安全和应用安全,下面的安全需求中属于系统安全的是(67),属于应用安全的是(68)。
    IP地址202.117.17.254/22是什么地址?
    公司的到一个B类地址块,需要划分成若干个包含1000台主机的子网,则可以划分成几个?
    PGP(Pretty Good Privacy)是一种电子邮件加密软件包,它提供数据加密和数字签名两种服务,采用(42)进行身份认证,使用(43) (128位密钥)进行数据加密,使用(44)进行数据完整性验证。 A.RSA公钥证书 B.RSA私钥证书 C.Kerboros证书 D.DES私钥证书
    comet反向Ajax模型原理与模型(笔记一)
    EasyARM-iMX257_U-Boot源代码移植分析
    linux移植u-boot(一)——U-Boot详解+自定义命令实战
    Ajax实现大文件切割上传
  • 原文地址:https://www.cnblogs.com/FCWORLD/p/5757878.html
Copyright © 2011-2022 走看看