反射機構を利用してjavaオブジェクトとオブジェクトの変換を完了します.

2817 ワード

マイクロサービスアーキテクチャのプロジェクトでは、我々は常に外観パターンの設計に遭遇し、コアのデータ構造を隠し、外部のrequestとreponseのデータ構造を暴露する.入れ子の階層が多くなれば、層のデータ変換は大量のコードを増加させ、プロジェクト全体がぶかぶかに見えます.たとえば:
public void saveVisitStatInfo(VisitStatRequest visitStatRequest) {
    VisitStatPO visitStatPO = new VisitStatPO();
    if(visitStatRequest != null) {
        visitStatPO.setMemberId(visitStatRequest.getMemberId());
        visitStatPO.setIpAddress(visitStatRequest.getIpAddress());
        visitStatPO.setUtmCampaign(visitStatRequest.getUtmCampaign());
        visitStatPO.setUtmContent(visitStatRequest.getUtmContent());
        visitStatPO.setUtmMedium(visitStatRequest.getUtmMedium());
        visitStatPO.setUtmSource(visitStatRequest.getUtmSource());
        visitStatPO.setUtmTerm(visitStatRequest.getUtmTerm());
        visitStatService.saveVisit(visitStatPO);
    } else {
        logger.error("Visit stat input is null");
    }
}
したがって、オブジェクトとオブジェクトの間の変換ツールを探して、統一変換を完了します.javaオブジェクトとオブジェクトの間の変換については、以下のような1、org.apphe.com mmons.beanutils.PropertyUtils.co pyPropties()方法2、org.springframe ork.beans.BenUtils.com pyPropties(source,target)方法3、json 4を利用してオブジェクトを回転させて変換します.
1番目と2番目はどちらも推奨されていません.1番目の性能が悪いため、Dateなどはサポートされていません.2番目はInteger、Long、Booleanなどがnullの転送に対応していません.また、同名の異なるタイプのデータ変換に対しては直接エラーが発生します.(ネット上では、値を与えないだけと言われています.ブロガーはJDK 1.7で親測定します.以下のとおりです.)org.springframe ork.FatalBenException:Could notneted exception is java.lang.IllagalArgment Exception:argment type mismatch org.spring frame ork.beans.BenUtils.com pyPropties(BenUtils.java:620)atog.springframe.Beantis.com
第3種のオススメは特に需要がない場合に使います.利点はクローンで、住所汚染が心配されていません.コードも簡単です.第4の種類は、変換過程において賦値に対して特定の要求がある場合に使用することを推奨する.利点は、すべてのタイプとデータをサポートし、変換中のデータ処理方式を自由に定義することができます.コードは以下の通りです
public static Object objToObj(Object source, Class> targetClazz) throws InstantiationException, IllegalAccessException {
	Object target = targetClazz.newInstance();
	Class sourceClazz = source.getClass();
	
	Field[] sourceFields = sourceClazz.getDeclaredFields();
	Field[] targetFields = target.getClass().getDeclaredFields();
	
	for (Field sourceField : sourceFields) {
		sourceField.setAccessible(true);
		for (Field targetField : targetFields) {
			if(targetField.getName().equals(sourceField.getName()) && targetField.getType() == sourceField.getType()) {
				int mod = targetField.getModifiers();
				if (Modifier.isStatic(mod) || Modifier.isFinal(mod)) {
					continue;
				}
				targetField.setAccessible(true);
				targetField.set(target, sourceField.get(source));
				break;
			}
		}
	}	
	return target;
}
このセグメントコードは主に、メンバ変数名とタイプが一致しているだけの浅いクローンオブジェクト変換を実現します.興味のある学生は判定条件を修正することにより、異なるデータ変換機能を実現することができます.再帰的アルゴリズムを追加して、深いクローン変換を実現することもできます.
最後に説明しなければならないのは、どのようなオブジェクトの変換機能を選択しても、直接set方法による値付け効率よりも低く、どのように選択するかは学生自身でコントロールする必要があります.