反射 判断属性类型

简介: 引用:http://blog.chinaunix.net/uid-26863299-id-3578280.html package com.cn.fanjg.rtti; import java.

引用:http://blog.chinaunix.net/uid-26863299-id-3578280.html

    1. package com.cn.fanjg.rtti;
    2. import java.lang.reflect.Field;
    3. import java.lang.reflect.InvocationTargetException;
    4. import java.lang.reflect.Method;
    5. import java.util.regex.Matcher;
    6. import java.util.regex.Pattern;
    7. /**
    8.  * @function:
    9.  * @date : 2013-4-10 下午03:28:53
    10.  */
    11. @SuppressWarnings("rawtypes")
    12. public class AssignValueForAttributeUtil {
    13.     /** 正则表达式 用于匹配属性的第一个字母 {@value [a-zA-Z]} **/
    14.     private static final String REGEX = "[a-zA-Z]";
    15.     public static void setAttrributeValue(Object obj,String attribute,Object value)
    16.     {
    17.         String method_name = convertToMethodName(attribute,obj.getClass(),true);
    18.         Method[] methods = obj.getClass().getMethods();
    19.         for (Method method : methods) {
    20.             /**
    21.              *     因为这里只是调用bean中属性的set方法,属性名称不能重复
    22.              * 所以set方法也不会重复,所以就直接用方法名称去锁定一个方法
    23.              * (注:在java中,锁定一个方法的条件是方法名及参数)
    24.              * **/
    25.             if(method.getName().equals(method_name))
    26.             {
    27.                 Class[] parameterC = method.getParameterTypes();
    28.                 try {
    29.                     /**如果是基本数据类型时(如int、float、double、byte、char、boolean)
    30.                      * 需要先将Object转换成相应的封装类之后再转换成对应的基本数据类型
    31.                      * 否则会报 ClassCastException**/
    32.                     if(parameterC[0] == int.class)
    33.                     {
    34.                         method.invoke(obj,((Integer)value).intValue());
    35.                         break;
    36.                     }else if(parameterC[0] == float.class){
    37.                         method.invoke(obj, ((Float)value).floatValue());
    38.                         break;
    39.                     }else if(parameterC[0] == double.class)
    40.                     {
    41.                         method.invoke(obj, ((Double)value).doubleValue());
    42.                         break;
    43.                     }else if(parameterC[0] == byte.class)
    44.                     {
    45.                         method.invoke(obj, ((Byte)value).byteValue());
    46.                         break;
    47.                     }else if(parameterC[0] == char.class)
    48.                     {
    49.                         method.invoke(obj, ((Character)value).charValue());
    50.                         break;
    51.                     }else if(parameterC[0] == boolean.class)
    52.                     {
    53.                         method.invoke(obj, ((Boolean)value).booleanValue());
    54.                         break;
    55.                     }else
    56.                     {
    57.                         method.invoke(obj,parameterC[0].cast(value));
    58.                         break;
    59.                     }
    60.                 } catch (IllegalArgumentException e) {
    61.                     e.printStackTrace();
    62.                 } catch (IllegalAccessException e) {
    63.                     e.printStackTrace();
    64.                 } catch (InvocationTargetException e) {
    65.                     e.printStackTrace();
    66.                 } catch (SecurityException e) {
    67.                     e.printStackTrace();
    68.                 } 
    69.             }
    70.         }
    71.     }
    72.     private static String convertToMethodName(String attribute,Class objClass,boolean isSet)
    73.     {
    74.         /** 通过正则表达式来匹配第一个字符 **/
    75.         Pattern p = Pattern.compile(REGEX);
    76.         Matcher m = p.matcher(attribute);
    77.         StringBuilder sb = new StringBuilder();
    78.         /** 如果是set方法名称 **/
    79.         if(isSet)
    80.         {
    81.             sb.append("set");
    82.         }else{
    83.         /** get方法名称 **/
    84.             try {
    85.                 Field attributeField = objClass.getDeclaredField(attribute);
    86.                 /** 如果类型为boolean **/
    87.                 if(attributeField.getType() == boolean.class||attributeField.getType() == Boolean.class)
    88.                 {
    89.                     sb.append("is");
    90.                 }else
    91.                 {
    92.                     sb.append("get");
    93.                 }
    94.             } catch (SecurityException e) {
    95.                 e.printStackTrace();
    96.             } catch (NoSuchFieldException e) {
    97.                 e.printStackTrace();
    98.             }
    99.         }
    100.         /** 针对以下划线开头的属性 **/
    101.         if(attribute.charAt(0)!='_' && m.find())
    102.         {
    103.             sb.append(m.replaceFirst(m.group().toUpperCase()));
    104.         }else{
    105.             sb.append(attribute);
    106.         }
    107.         return sb.toString();
    108.     }
    109.     public static Object getAttrributeValue(Object obj,String attribute)
    110.     {
    111.         String methodName = convertToMethodName(attribute, obj.getClass(), false);
    112.         Object value = null;
    113.         try {
    114.             /** 由于get方法没有参数且唯一,所以直接通过方法名称锁定方法 **/
    115.             Method methods = obj.getClass().getDeclaredMethod(methodName);
    116.             if(methods != null)
    117.             {
    118.                 value = methods.invoke(obj);
    119.             }
    120.         } catch (SecurityException e) {
    121.             e.printStackTrace();
    122.         } catch (NoSuchMethodException e) {
    123.             e.printStackTrace();
    124.         } catch (IllegalArgumentException e) {
    125.             e.printStackTrace();
    126.         } catch (IllegalAccessException e) {
    127.             e.printStackTrace();
    128.         } catch (InvocationTargetException e) {
    129.             e.printStackTrace();
    130.         }
    131.         return value;
    132.     }
    133. }
相关文章
|
监控 NoSQL Java
后端接口性能优化分析-问题发现&问题定义(下)
后端接口性能优化分析-问题发现&问题定义
264 0
|
SQL 缓存 监控
后端接口性能优化分析-问题发现&问题定义(上)
后端接口性能优化分析-问题发现&问题定义
614 0
|
Java Spring
Spring AOP切点表达式(Pointcut)详解
Spring 的 AOP 中的一个核心概念是切点(Pointcut),切点表达式定义通知(Advice)执行的范围。
5054 0
|
JavaScript
Vue 打包后打开为空白页面 并且控制台报错‘Failed to load resource: net::ERR_FILE_NOT_FOUND’
Vue 打包后打开为空白页面 并且控制台报错‘Failed to load resource: net::ERR_FILE_NOT_FOUND’
Vue 打包后打开为空白页面 并且控制台报错‘Failed to load resource: net::ERR_FILE_NOT_FOUND’
|
Java Spring 容器
Java获取接口的所有实现类方法
这篇文章介绍了在Java中获取接口所有实现类的方法,包括使用JDK的ServiceLoader(SPI机制)和Spring Boot中的@Autowired自动注入及ApplicationContextAware接口两种方式。
1012 1
|
SQL XML 存储
四.吃透Mybatis源码-通过分析Pagehelper源码来理解Mybatis的拦截器
面试官:用过pagehelper做分页把,你说一下pagehelper的分页实现原理。额…此时你只能说我不知道。如果你事先看了我接下来的这篇文章,相信你一定也把这个面试题答得很好。
|
Go Java
mockito中两种部分mock的实现,spy、callRealMethod
什么是类的部分mock(partial mock)?A:部分mock是说一个类的方法有些是实际调用,有些是使用mockito的stubbing(桩实现)。   为什么需要部分mock? A:当需要测试一个组合方法(一个方法需要其它多个方法协作)的时候,某个叶子方法(只供别人调用,自己不依赖其它反复)已经被测试过,我们其实不需要再次测试这个叶子方法,so,让叶子打桩实现返回结果,上层方法实际调用并测试。
4646 1
|
SQL Oracle 关系型数据库
【SQL开发实战技巧】系列(五):从执行计划看IN、EXISTS 和 INNER JOIN效率,我们要分场景不要死记网上结论
从执行计划角度分析IN、EXISTS 和 INNER JOIN效率而不是死记网上结论、表的5种关联:INNER JOIN、LEFT JOIN、RIGHT JOIN 和 FULL JOIN 解析【SQL开发实战技巧】这一系列博主当作复习旧知识来进行写作,毕竟SQL开发在数据分析场景非常重要且基础,面试也会经常问SQL开发和调优经验,相信当我写完这一系列文章,也能再有所收获,未来面对SQL面试也能游刃有余~。
【SQL开发实战技巧】系列(五):从执行计划看IN、EXISTS 和 INNER JOIN效率,我们要分场景不要死记网上结论
|
JavaScript 前端开发
Webpack 中的 module、chunk、bundle 究竟是什么?
Webpack 中的 module、chunk、bundle 究竟是什么?
515 0
MobaXterm中文乱码编码问题,无需修改系统编码,GB2312
MobaXterm中文乱码编码问题,无需修改系统编码,GB2312