<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    子非魚

    BlogJava 首頁 新隨筆 聯系 聚合 管理
      21 Posts :: 0 Stories :: 1 Comments :: 0 Trackbacks
    BeanUtils和PropertyUtils類是許多開源框架中頻繁使用的兩個工具,它們都能實現將一個類中的屬性拷貝到另一個類中,這個功能甚至是spring實現依賴注入的基礎。研究一下apache的comon包中如何實現這個兩個工具,可以發現它們都是使用java.lang.reflect和java.beans這兩個包下的幾個類來實現的。

        這里我們通過編寫一個將一個類的所有屬性拷貝到另一個類的相應屬性的方法來分析是如何實現拷貝功能的.先把方法放上來:

    /** 實現將源類屬性拷貝到目標類中
       * 
    @param source 
       * 
    @param target
       
    */

    public static void copyProperties(Object source, Object target) {
       
    try {
            
    //獲取目標類的屬性信息
            BeanInfo targetbean = Introspector.getBeanInfo(target.getClass());
            PropertyDescriptor[] propertyDescriptors 
    = targetbean.getPropertyDescriptors();
            
    //對每個目標類的屬性查找set方法,并進行處理
            for (int i = 0; i < propertyDescriptors.length; i++{
                 PropertyDescriptor pro 
    = propertyDescriptors[i];
                 Method wm 
    = pro.getWriteMethod();
                 
    if (wm != null{//當目標類的屬性具有set方法時,查找源類中是否有相同屬性的get方法
                     BeanInfo sourceBean = Introspector.getBeanInfo(source.getClass());
                     PropertyDescriptor[] sourcepds 
    = sourceBean.getPropertyDescriptors();
                     
    for (int j = 0; j < sourcepds.length; j++{
                          
    if (sourcepds[j].getName().equals(pro.getName())) //匹配
                               Method rm = sourcepds[j].getReadMethod();
                               
    //如果方法不可訪問(get方法是私有的或不可達),則拋出SecurityException
                               if (!Modifier.isPublic(rm.getDeclaringClass().getModifiers())) {
                                    rm.setAccessible(
    true);
                               }

                              
    //獲取對應屬性get所得到的值
                              Object value = rm.invoke(source,new Object[0]);
                              
    if (!Modifier.isPublic(wm.getDeclaringClass().getModifiers())) {
                                   wm.setAccessible(
    true);
                              }

                              
    //調用目標類對應屬性的set方法對該屬性進行填充
                              wm.invoke((Object) target, new Object[] { value });
                              
    break;
                          }

                     }

                  }

              }

       }
     catch (IntrospectionException e) {
           e.printStackTrace();
       }
     catch (IllegalArgumentException e) {
           e.printStackTrace();
       }
     catch (IllegalAccessException e) {
           e.printStackTrace();
      }
     catch (InvocationTargetException e) {
          e.printStackTrace();
      }

    }

    兩個工具的其他方法實現雖然有點差別,但原理都跟上面的例子差不多,有興趣的話可以寫個測試類試試是否可以使用.

    轉自: http://lemonfamily.blogdriver.com/lemonfamily/1240784.html

    posted on 2007-10-25 10:16 子非魚 閱讀(519) 評論(0)  編輯  收藏 所屬分類: JAVA
    主站蜘蛛池模板: 国产一级一毛免费黄片| jizz免费观看| 亚洲大片在线观看| 中文毛片无遮挡高清免费| 久久国产成人亚洲精品影院 | 久久精品国产免费观看| 亚洲国产综合专区在线电影| 嫩草在线视频www免费观看| 久久久久久亚洲精品| 无码一区二区三区免费| 亚洲精品动漫在线| 在线观看免费人成视频色| 亚洲暴爽av人人爽日日碰| 日韩精品内射视频免费观看| 久久亚洲AV成人无码软件| 999在线视频精品免费播放观看| 亚洲va在线va天堂成人| 日本最新免费不卡二区在线| 狼色精品人妻在线视频免费| 亚洲熟妇无码八AV在线播放| 性xxxx视频免费播放直播| tom影院亚洲国产一区二区| 国产国产成年年人免费看片| 丁香六月婷婷精品免费观看 | 亚洲高清日韩精品第一区| 曰批视频免费30分钟成人| 色网站在线免费观看| 亚洲成AV人片一区二区密柚| 国产人成免费视频网站| 亚洲欧美国产国产一区二区三区| 亚洲高清偷拍一区二区三区 | 久操免费在线观看| 亚洲人成网站在线在线观看| 亚洲精品国产电影| 50岁老女人的毛片免费观看| 在线精品自拍亚洲第一区| 国产午夜亚洲精品午夜鲁丝片| 成人免费激情视频| 国产黄在线播放免费观看| 亚洲国产成人精品无码区在线秒播| 成人永久福利免费观看|