package com.th.demo.tools;


import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.util.Date;

/**
 * Created by litai on 2018/6/7.
 */

public class ClassTool {
//1.考虑安全访问范围内的属性，没有权限访问到的属性不读取
    /**
     * 根据属性名获取属性值
     *
     * @param fieldName
     * @param object
     * @return
     */
//    private String getFieldValueByFieldName(String fieldName, Object object) {
//        try {
//            Field field = object.getClass().getField(fieldName);
//            //设置对象的访问权限，保证对private的属性的访问
//
//            return  (String)field.get(object);
//        } catch (Exception e) {
//
//            return null;
//        }
//    }


    // 2.不考虑从祖先类继承的属性，只获取当前类属性，包括四类访问权限，private，protect，default，public

    /**
     * 根据属性名获取属性值
     *
     * @param fieldName
     * @param object
     * @return
     */
    public static String getFieldValueByFieldName(String fieldName, Object object) {
        try {
            String result="";
            Field field = object.getClass().getDeclaredField(fieldName);
            //设置对象的访问权限，保证对private的属性的访问
            field.setAccessible(true);
            if(field.getType().getName().contains("String")){
                result=(String)field.get(object);
            }else if (field.getType().getName().contains("Integer")){
                result = ((Integer)field.get(object)).toString();
            }else if (field.getType().getName().contains("BigDecimal")){
                result=((BigDecimal)field.get(object)).toString();
            }else if (field.getType().getName().contains("Date")){
                result=DateTools.DateToStr((Date)field.get(object),"yyyy-MM-dd HH:mm:ss") ;
            }

            return  result;
        } catch (Exception e) {

            return null;
        }
    }

    //3.考虑父类继承过来的属性，包括四类访问权限，private，protect，default，public


    /**
     * 根据属性名获取属性元素，包括各种安全范围和所有父类
     *
     * @param fieldName
     * @param object
     * @return
     */
//    public static Field getFieldByClasss(String fieldName, Object object) {
//        Field field = null;
//        Class<?> clazz = object.getClass();
//
//        for (; clazz != Object.class; clazz = clazz.getSuperclass()) {
//            try {
//                field = clazz.getDeclaredField(fieldName);
//            } catch (Exception e) {
//                // 这里甚么都不能抛出去。
//                // 如果这里的异常打印或者往外抛，则就不会进入
//
//            }
//        }
//        return field;
//
//    }
}
