反射 判断属性类型

简介: 引用: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. }
相关文章
|
8月前
通过反射获取方法返回的类型
通过反射获取方法返回的类型
|
8月前
|
测试技术
反射获取或修改对象属性的值
* 获取单个对象的所有键值对
59 3
|
Java 程序员 PHP
C++的对象与类的含义
C++是一门面向对象的编程语言,理解C++需要掌握类(class)和对象(object)这两个概念。 C++ 中的类(Class)可以看做C语言中结构体(Struct)的升级版。结构体是一种构造类型,可以包含若干成员变量,每个成员变量的类型可以不同;可以通过结构体来定义结构体变量,每个变量拥有相同的性质。例如: #include <stdio.h> //定义结构体 Student struct Student{ //结构体包含的成员变量 char *name; int age; float score; }; //显示结构体的成员变量 void displ
|
Java 编译器
重载的方法能否根据返回类型进行区分?
重载的方法不能根据返回类型进行区分。方法的重载是基于方法名称和参数列表来进行区分的,与返回类型无关。这是因为在Java中,编译器在确定要调用哪个重载方法时,仅根据传递给方法的参数来进行决策。
393 0
对象定义-解构-枚举属性遍历以及对象内函数
对象定义-解构-枚举属性遍历以及对象内函数
80 0
|
前端开发 Java 开发者
你还在用 if 判断参数是否在枚举范围内吗?我已经用上注解了。
通过自定义注解来实现参数值的枚举范围校验,适用于场景就是当一个 int, String 值是在一个枚举的范围内,通过 Spring MVC 中的参数校验拓展来实现规范的参数校验,保证用户传入参数的有效性。以减少代码中的 if ... else 逻辑。
594 0
Java反射得到属性和属性的值和设置属性的值
Java反射得到属性和属性的值和设置属性的值
|
编解码
利用反射机制获取未知类型的枚举的信息
原文:利用反射机制获取未知类型的枚举的信息 开发游戏设置选项遇到一个问题,我有两个枚举,一个是屏幕分辨率,一个是语言   我需要在不知道一个枚举到底是哪一个枚举类型的情况下,获取这个枚举的值以及这个枚举类型的所有可能值。
711 0
|
C#
C#使用反射设置属性值
最近在Refix一个支持Excel文件导入导出功能时,发现有用到反射的相关技能。故而在网上查了些资料,通过代码调试加深下理解。 class Program { static void Main(string[] args) { ...
1383 0