zoukankan      html  css  js  c++  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. }
  • 相关阅读:
    借了个屏幕来用
    生命开始的地方
    看了STLPort的安装方法,晕了
    程序员必备的10大健康装备!
    《代码整洁之道》读书笔记
    Mockito使用
    学习Emacs的理由
    shell 脚本编程的10 个最佳实践
    MongoDB入门
    用Orgmode实践《奇特的一生》
  • 原文地址:https://www.cnblogs.com/sode/p/3229189.html
Copyright © 2011-2022 走看看