zoukankan      html  css  js  c++  java
  • 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;
            }
            
        }
    
    
    
  • 相关阅读:
    线程
    sqlite3数据库操作
    20、android解决方案(转载)
    19、android面试题整理(自己给自己充充电吧)
    18、ESC/POS指令集在android设备上使用实例(通过socket)
    17、android设备如何防止屏幕休眠(转载)
    16、根据年月日获取周几 以及整理的日期常用的工具类
    15、android 用toast实现简单的进度显示
    14、到底改如何区分android的平板、电视、手机
    13、主线程任务太多导致异常退出(The application may be doing too much work on its main thread)
  • 原文地址:https://www.cnblogs.com/lshan/p/10956977.html
Copyright © 2011-2022 走看看