【Java】BeanUtilsを用いたcopyPropertiesフィルタ属性パラメータを含む方法の応用


に質問
需要:更新データのインタフェースに由来し、クラス内のフィールドの値を変更できることが要求されます.一部のみ変更できます.変更されていないフィールドはデフォルトでは変更されません.例では、更新が必要なターゲット下位エンティティpoの拡張サブクラス(このオブジェクトがpoiであると仮定)を含むビューレイヤのパッケージオブジェクトvoが使用され、他の関連属性とは無関係である.フロントエンドからデータが変更されたvoを取得した後、更新されたpoを保存する必要がある.
構想BeanUtils.copyProperties(source, target, ignoreProperties)という方法で、ソースの属性を、属性名の一部をフィルタリングし、ターゲットにコピーします.
ignorePropertiesの宣言タイプはString...ignoreProperties
プロパティフィールド名が得られる配列を取得するには、反射メカニズムが必要です.
プロセス
  • poオブジェクトを新規作成し、copyPropertiesを使用してpoiの既存の値の属性をpoにコピーします.
  • は、フィルタ機能の呼び出し
  • のために空でないフィールド名配列を取得する方法を設計する.
  • copyPropertiesのフィルタリロードメソッドを使用して、元のpoを新しいpo
  • にコピーします.
    反射取得フィールド名の実装
    ターゲットは空でないフィールドを取得することです
    /**
     *         vo itemsCustom       
     * @param objClass     Class  ,        Class  ,   vo
     * @param vo
     * @return
     * @throws ClassNotFoundException 
     */
    private String[] getProperties(Class objClass,ItemsQueryVo vo) throws ClassNotFoundException {
    	//  ItemsCustom class 
    	ItemsCustom obj = vo.getItemsCustom();
    	List<String> properties = new ArrayList<>();
    	//    
    	try {
    		//  getDeclaredFields()     getFields()    
    		//           objClass    ,
    		//   obj.getClass()       ,  obj     objClass  
    		for(Field field: objClass.getDeclaredFields()) {
    			//      private
    			field.setAccessible(true);
    			//       
    			if(field.get(obj)!=null)
    				properties.add(field.getName());
    		}
    	}catch (Exception e) {
    		/*
    		 *        ,return null      
    		 *           ,            ,          
    		 */
    		return null;
    	}
    	//   
    	String[] propers = new String[properties.size()];
    	return properties.toArray(propers);
    }
    

    上段のコードはプロセスの第2のステップを実現しました
    上記のコードの簡単な方法で、より類似した汎用性のあるツールを書くことができます.