• 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.     }  
  • 相关阅读:
    HTML DOM教程 9HTML DOM Window 对象
    HTML DOM教程 11HTML DOM Screen 对象
    Android项目中把bin文件夹里面的.apk文件删除,怎么让它再生成
    Qt把ping www.baidu.com之后的内容的内容输出到一个名为output的文档
    Qt之QProcess 和 c语言对比
    Git的Windows版本Msysgit的中文乱码解决
    多系统 grub之ubuntu的 grub
    QT中调用外部程序:QProcess的使用
    repo的小结
    恢复Ubuntu默认的面板
  • 原文地址:https://www.cnblogs.com/interdrp/p/8044852.html
Copyright © 2020-2023  润新知