反射 判断属性类型

简介: 引用: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. }
相关文章
|
26天前
通过反射获取方法返回的类型
通过反射获取方法返回的类型
13 1
|
4月前
自定义封装一个方法让这个方法可以判断所有的数据类型并返回
自定义封装一个方法让这个方法可以判断所有的数据类型并返回
15 0
|
8月前
对象的属性和值转换
对象的属性和值转换
25 0
|
Java 数据库
java反射机制查找类的属性并赋值
先说一下需求:最近做一个项目其中需要将前台传来的数组存到数据库,但是这个表里有15个字段,集合是不固定的,然后要把这个集合的数值赋给这个类的相应属性,然后存到数据库中。集合长度应小于等于这个类属性的个数。
273 0
|
JavaScript 前端开发
证明函数是对象的特殊子类型和函数的对象属性
证明函数是对象的特殊子类型和函数的对象属性
|
前端开发 Java 开发者
你还在用 if 判断参数是否在枚举范围内吗?我已经用上注解了。
通过自定义注解来实现参数值的枚举范围校验,适用于场景就是当一个 int, String 值是在一个枚举的范围内,通过 Spring MVC 中的参数校验拓展来实现规范的参数校验,保证用户传入参数的有效性。以减少代码中的 if ... else 逻辑。
399 0
Java反射得到属性和属性的值和设置属性的值
Java反射得到属性和属性的值和设置属性的值
|
编解码
利用反射机制获取未知类型的枚举的信息
原文:利用反射机制获取未知类型的枚举的信息 开发游戏设置选项遇到一个问题,我有两个枚举,一个是屏幕分辨率,一个是语言   我需要在不知道一个枚举到底是哪一个枚举类型的情况下,获取这个枚举的值以及这个枚举类型的所有可能值。
691 0
|
C#
C#使用反射设置属性值
最近在Refix一个支持Excel文件导入导出功能时,发现有用到反射的相关技能。故而在网上查了些资料,通过代码调试加深下理解。 class Program { static void Main(string[] args) { ...
1333 0