java 反射原理写了一个赋值和取值通用类

  首先了解一下反射的原理,什么是反射?所谓的反射就是指java 语言在运行时拥有一项自观的能力,反射能使你得到装载到 jvm 中的类的内部信息,它不需要你在编码的时候就知道所需类的内部信息,允许程序执行时才得到所需类的内部信息。反射能够构建灵活的应用的程序。 

      使用反射为bean 赋值 ,主要表现在几点,一:利用反射查找出bean类所有public方法,类定义的属性。二:如果是赋值,必须先判断属性类型,再逐个赋值,

      三:调用method 类的invoke方法访问bean 的set 、get 方法设值、取值。

      看下面代码:

[html]
  1. package com.reflect;  
  2.   
  3. import java.lang.reflect.Field;  
  4. import java.lang.reflect.Method;  
  5. import java.text.SimpleDateFormat;  
  6. import java.util.Date;  
  7. import java.util.HashMap;  
  8. import java.util.Locale;  
  9. import java.util.Map;  
  10.   
  11. public class ReflectGetValue {  
  12.     /**  
  13.      * 取出bean 属性和值  
  14.      * @param obj  
  15.      * @return  
  16.      * @throws Exception  
  17.      */  
  18.     public static Map<Object,Object> getFileValue(Object obj) throws Exception{  
  19.         Map<Object, Objectmap = new HashMap<Object, Object>();  
  20.         Class<?cls = obj.getClass();  
  21.         Method methods[] = cls.getDeclaredMethods();  
  22.         Field fields[] = cls.getDeclaredFields();  
  23.           
  24.         for(Field field:fields){  
  25.               
  26.             String fldtype = field.getType().getSimpleName();  
  27.             String getMetName = pareGetName(field.getName());  
  28.             String result ="";  
  29.             if(!checkMethod(methods,getMetName)){  
  30.                 continue;  
  31.             }  
  32.             Method method = cls.getMethod(getMetName, null);  
  33.             Object object = method.invoke(obj, new Object[]{});  
  34.             if(null != object){  
  35.                 if(fldtype.equals("Date")){  
  36.                     result = fmlDate((Date)object);  
  37.                 }  
  38.                 result = String.valueOf(object);  
  39.             }  
  40.             map.put(field.getName(), result);  
  41.         }  
  42.           
  43.         return map;  
  44.     }  
  45.     /**  
  46.      * 设置bean 属性值  
  47.      * @param map  
  48.      * @param bean  
  49.      * @throws Exception  
  50.      */  
  51.     public static void setFieldValue(Map<Object, Object> map, Object bean) throws Exception{  
  52.         Class<?cls = bean.getClass();  
  53.         Method methods[] = cls.getDeclaredMethods();  
  54.         Field fields[] = cls.getDeclaredFields();  
  55.           
  56.         for(Field field:fields){  
  57.             String fldtype = field.getType().getSimpleName();  
  58.             String fldSetName = field.getName();  
  59.             String setMethod = pareSetName(fldSetName);  
  60.             if(!checkMethod(methods, setMethod)){  
  61.                 continue;  
  62.             }  
  63.             Object value = map.get(fldSetName);  
  64.             System.out.println(value.toString());  
  65.             Method method = cls.getMethod(setMethod, field.getType());  
  66.             System.out.println(method.getName());  
  67.             if(null != value){  
  68.                 if("String".equals(fldtype)){  
  69.                     method.invoke(bean, (String)value);  
  70.                 }else if("Double".equals(fldtype)){  
  71.                     method.invoke(bean, (Double)value);  
  72.                 }else if("int".equals(fldtype)){  
  73.                     int val = Integer.valueOf((String)value);  
  74.                     method.invoke(bean, val);  
  75.                 }  
  76.             }  
  77.               
  78.         }      
  79.     }  
  80.     /**  
  81.      * 拼接某属性get 方法  
  82.      * @param fldname  
  83.      * @return  
  84.      */  
  85.     public static String pareGetName(String fldname){  
  86.         if(null == fldname || "".equals(fldname)){  
  87.             return null;  
  88.         }  
  89.         String pro = "get"+fldname.substring(0,1).toUpperCase()+fldname.substring(1);  
  90.         return pro;  
  91.     }  
  92.     /**  
  93.      * 拼接某属性set 方法  
  94.      * @param fldname  
  95.      * @return  
  96.      */  
  97.     public static String pareSetName(String fldname){  
  98.         if(null == fldname || "".equals(fldname)){  
  99.             return null;  
  100.         }  
  101.         String pro = "set"+fldname.substring(0,1).toUpperCase()+fldname.substring(1);  
  102.         return pro;  
  103.     }  
  104.     /**  
  105.      * 判断该方法是否存在  
  106.      * @param methods  
  107.      * @param met  
  108.      * @return  
  109.      */  
  110.     public static boolean checkMethod(Method methods[],String met){  
  111.         if(null != methods ){  
  112.             for(Method method:methods){  
  113.                 if(met.equals(method.getName())){  
  114.                     return true;  
  115.                 }  
  116.             }  
  117.         }          
  118.         return false;  
  119.     }  
  120.     /**  
  121.      * 把date 类转换成string  
  122.      * @param date  
  123.      * @return  
  124.      */  
  125.     public static String fmlDate(Date date){  
  126.         if(null != date){  
  127.             SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss",Locale.US);  
  128.             return sdf.format(date);  
  129.         }  
  130.         return null;  
  131.     }  
  132. }  
  133.   
  134. ----------------------------------  
[html]
    1. 测试方法  
    2.   
    3.     public static void main(String[] args) {  
    4.         try {  
    5.               
    6.             Map<Object, Objectmap = new HashMap<Object, Object>();  
    7.             map.put("yi", "reyo");  
    8.             map.put("san", "27");  
    9.             map.put("er", "2010-10-24");  
    10.              
    11.             Bean bean = new Bean();  
    12.             ReflectGetValue.setFieldValue(map, bean);  
    13.             Map<Object, Objectm= ReflectGetValue.getFileValue(bean);  
    14.             System.out.println(m.toString());  
    15.         } catch (Exception e) {  
    16.             e.printStackTrace();  
    17.         }  
    18.     }  
原文地址:https://www.cnblogs.com/interdrp/p/8044852.html