ReflectUtil反射工具类

Posted lshan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ReflectUtil反射工具类相关的知识,希望对你有一定的参考价值。

 

原文:https://blog.csdn.net/u011704894/article/details/50548925 
ReflectUtil:
    import java.lang.reflect.Field;
    import java.lang.reflect.Method;
     
    /**
     * Java反射工具类<br>
     * 提供以下几个功能:<br>
     * 1. 取最简类名<br>
     * 2. 动态赋值<br>
     * 3. 动态取值<br>
     * 4. 判断是否普通类型(自定义成员变量)<br>
     * 5. 动态取指定类的所有属性名<br>
     * @author nmyy
     * @version 1.0
     */
    public class ReflectUtil {
     
        /**
         * custom commmon field type 
         */
        public static String[] commonFieldType = {
                "int", "long", "short", "double", "float", "char", "byte", "boolean", 
                "class java.lang.String", "class java.lang.Integer", "class java.lang.Long", 
                "class java.lang.Short",  "class java.lang.Double",  "class java.lang.Float", 
                "class java.lang.Byte",   "class java.lang.Boolean", "class java.math.BigDecimal"
        };
            
        /**
         * 获取最简类名(去除包名)<br>
         * eg : com.csdn.util.ReflectUtil > ReflectUtil
         * @param className
         * @return simpleClassName
         * @author nmyy
         */
        public static String getSimpleClassName(String className) {
            return className.substring(className.lastIndexOf(".") + 1);
        }
        
        /**
         * 为指定对象的指定属性动态赋予指定值
         * @param obj 指定对象
         * @param fieldName 指定属性
         * @param value 指定值
         * @return obj
         * @author nmyy
         */
        public static Object dynamicSetValue(Object obj, String fieldName, Object value) {
            try {
                String firstLetter = fieldName.substring(0, 1).toUpperCase(); // 取属性首字母转大写
                String setMethodName = "set" + firstLetter + fieldName.substring(1); // set方法名
                Field field = obj.getClass().getDeclaredField(fieldName); // 获取属性
                Method setMethod = obj.getClass().getDeclaredMethod(setMethodName, field.getType()); // 获取set方法
                setMethod.invoke(obj, value); // 通过set方法动态赋值
                // obj.getClass().getDeclaredField(fieldName).set(obj, value) 为直接对指定public属性赋值,不实用
            } catch (Exception e) {
                e.printStackTrace();
            }
            return obj;
        }
        
        /**
         * 动态获取指定对象指定属性的值
         * @param obj 指定对象
         * @param fieldName 指定属性
         * @return 属性值
         * @author nmyy
         */
        public static Object dynamicGetValue(Object obj, String fieldName) {
            Object value = null;
            try {
                //if ( isCommonTypeField(obj, fieldName) ) { // 限普通类型
                    String firstLetter = fieldName.substring(0, 1).toUpperCase(); // 取属性首字母转大写
                    String getMethodName = "get" + firstLetter + fieldName.substring(1); // get方法名
                    Method getMethod = obj.getClass().getDeclaredMethod(getMethodName); // 获取get方法
                    value = getMethod.invoke(obj); // 动态取值
                //}
            } catch (Exception e) {
                e.printStackTrace();
            }
            return value;
        }
        
        /**
         * 判断指定对象中的指定属性名的类型是否属于自定义普通数据类型
         * @param obj 指定对象
         * @param fieldName 指定属性名
         * @return
         * @author nmyy
         */
        public static boolean isCommonTypeField(Object obj, String fieldName) {
            boolean result = false;
            try {
                Field field = obj.getClass().getDeclaredField(fieldName);
                String type = field.getGenericType().toString();
                for ( int i = 0; i < commonFieldType.length; i++ ) {
                    if ( commonFieldType[i].equals(type) ) {
                        result = true;
                        break;
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return result;
        }
        
        /**
         * 获取指定类的所有属性名
         * @param className 指定类全名
         * @return 所有属性名
         * @author nmyy
         */
        public static String[] getAllFieldName(String className) {
            String[] fieldName = null;
            try {
                Field[] fields = Class.forName(className).getDeclaredFields();
                fieldName = new String[fields.length];
                for ( int i = 0; i < fields.length; i++ ) {
                    fieldName[i] = fields[i].getName();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return fieldName;
        }
        
    }


 

以上是关于ReflectUtil反射工具类的主要内容,如果未能解决你的问题,请参考以下文章

java 反射代码片段

ReflectUtil

elasticsearch代码片段,及工具类SearchEsUtil.java

反射机制

反射机制入门

反射机制入门