All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.datastax.util.lang.ReflectObjectUtil Maven / Gradle / Ivy

The newest version!
package com.datastax.util.lang;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.*;
import java.util.stream.Collectors;

/**
 * Created by hsuyung on 2019/1/17.
 */
public class ReflectObjectUtil {

    /**
     * 单个对象的所有键值
     * @param obj
     * @return
     */
    public static Map getKeyAndValue(Object obj) {
        if(obj == null)
            return null;
        Map map = new HashMap<>();
        // 得到类对象
        Class objClass = obj.getClass();
        // 得到类中的所有属性集合
        Field[] fs = objClass.getDeclaredFields();
        for (int i = 0; i < fs.length; i++) {
            Field f = fs[i];
            f.setAccessible(true); // 设置些属性是可以访问的
            try {
                Object val = f.get(obj);       // 得到此属性的值
                map.put(f.getName(), val);// 设置键值
            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
        return map;
    }

    /**
     * 映射同属性名到其他对象
     * @param obj
     * @param target
     * @param 
     * @return
     */
    public static  T copyToTarget(Object obj, T target) {
        if(obj == null)
            return null;
        // 得到类对象
        Class objClass = obj.getClass();
        // 得到类中的所有属性集合
        Field[] fs = objClass.getDeclaredFields();
        Field[] superFs = objClass.getSuperclass().getDeclaredFields();
        setFields(obj, target, fs, 0);
        setFields(obj, target, superFs, 1);
        return target;
    }

    /**]
     * @param obj
     * @param target
     * @param fs
     * @param level 0,1  0 当前层级,1  父类层级
     * @param 
     */
    private static  void setFields(Object obj, T target, Field[] fs, int level) {

        Method[] methods = target.getClass().getMethods();

        for (int i = 0; i < fs.length; i++) {
            Field f = fs[i];
            f.setAccessible(true); // 设置些属性是可以访问的
            try {
                Object val = f.get(obj);


                for (Method method :methods){
                    try {


                        if(method.getName().startsWith("set") && method.getParameterCount() == 1 ){
                            Class paramClass = method.getParameterTypes()[0];
                            if(! paramClass.equals(f.getType()))  continue;
                            if(paramClass.equals(Boolean.class)
                                    || paramClass.equals(boolean.class)){
                                if(method.getName().toLowerCase().equals("set"+f.getName().substring(2).toLowerCase())){
                                    method.invoke(target,val);
                                }else  if(method.getName().toLowerCase().equals("set"+f.getName().toLowerCase())){
                                    method.invoke(target,val);
                                }
                            }else {
                                if(method.getName().toLowerCase().equals("set"+f.getName().toLowerCase())){
                                    method.invoke(target,val);
                                }
                            }

                        }

                    } catch (InvocationTargetException e) {
                        e.printStackTrace();
                    }
                }

            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 单个对象的某个键的值
     * @param obj
     * @param key
     * @return
     */
    public static Object getValueByKey(Object obj, String key) {
        if(obj == null)
            return null;
        Class objClass = obj.getClass();
        // 得到类中的所有属性集合
        Field[] fs = objClass.getDeclaredFields();
        for (int i = 0; i < fs.length; i++) {
            Field f = fs[i];
            f.setAccessible(true); // 设置些属性是可以访问的
            try {
                if (f.getName().endsWith(key)) {
                    return f.get(obj);
                }
            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
        // 没有查到时返回空字符串
        return null;
    }

    public static List> getKeysAndValues(List list) {
        if(list == null)
            return null;
        return list.stream().map(obj->getKeyAndValue(obj)).collect(Collectors.toList());
    }

    public static List getValuesByKey(List list, String key) {
        if(list == null)
            return null;
        return list.stream().map(obj->getValueByKey(obj,key)).collect(Collectors.toList());

    }




   /* public static void main(String[] args){



    }*/


}