나는 생각 스프링 프레임 워크 수도 스프링 코어-4.1.5의 help.Here의 내 예 :
클래스 선언 :
public static class A{
private String a;
private String b;
private String c;
private C d;
private int e;
//getter&setter here
public static class C {
private String aa;
private String bb;
private String cc;
//getter&setter here
public static class B{
private Integer a;
private Long b;
private Boolean c;
private D d;
private Integer e;
//getter&setter here
public static class D {
private Integer aa;
private Long bb;
private Boolean cc;
//getter&setter here
class ObjectConverter implements Converter<Object, Object> {
private final ConversionService conversionService;
private final Class targetClass;
public ObjectConverter(ConversionService conversionService, Class targetClass) {
this.conversionService = conversionService;
this.targetClass = targetClass;
}
@Override
public Object convert(Object source) {
Object ret=null;
try {
ret = targetClass.newInstance();
Field[] fields = targetClass.getDeclaredFields();
for (Field field : fields) {
PropertyDescriptor sourceDescriptor = new PropertyDescriptor(field.getName(),source.getClass());
PropertyDescriptor targetDescriptor = new PropertyDescriptor(field.getName(),targetClass);
if (sourceDescriptor.getReadMethod()==null || targetDescriptor.getWriteMethod() == null) {
//record error here
break;
}
Class<?> sourcePType = sourceDescriptor.getPropertyType();
Class<?> targetPType = targetDescriptor.getPropertyType();
if(conversionService.canConvert(sourcePType,targetPType)){
Object sourceValue = sourceDescriptor.getReadMethod().invoke(source);
Object targetValue = conversionService.convert(sourceValue, targetPType);
targetDescriptor.getWriteMethod().invoke(ret,targetValue);
}
}
} catch (Exception e) {
e.printStackTrace();
}
return ret;
}
}
주요 방법 :
A orgA = new A();
orgA.a="123";
orgA.b="1234567";
orgA.c="1";
orgA.d = new C();
orgA.d.aa="321";
orgA.d.bb="7654321";
orgA.d.cc="0";
orgA.e=-99;
System.out.println(orgA);
try {
ConfigurableConversionService conversionService = new DefaultConversionService();
//if you are not satisfied with the final A result, then
//customize your own Boolean->String Converter;
// conversionService.addConverter(new Converter<Boolean, String>() {
// @Override
// public String convert(Boolean source) {
// return source==null||!source?"0":"1";
// }
// });
conversionService.addConverter(A.class, B.class, new ObjectConverter(conversionService, B.class));
conversionService.addConverter(B.class, A.class, new ObjectConverter(conversionService, A.class));
conversionService.addConverter(C.class, D.class, new ObjectConverter(conversionService, D.class));
conversionService.addConverter(D.class, C.class, new ObjectConverter(conversionService, C.class));
B b = conversionService.convert(orgA, B.class);
System.out.println(b);
A a = conversionService.convert(b, A.class);
System.out.println(a);
} catch (Exception e) {
e.printStackTrace();
}
검색 결과 :
A {a = '123', b = '1234567', c = '1', d = C {aa = '321', bb = '7654321', cc = '0'}, e =
B {a = 123, b = 1234567, c = true, d = D {aa = 321, bb = 7654321, cc = false}, e = -99}
A {a = '123', b = '1234567', c = 'true', d = C {aa = '321', bb = '7654321', cc = 'false'}, e = -99}
이것은 좋은 해결책 인 것 같습니다. 변환기를 선언해야하는 이유는 자동으로 소스 및 대상 클래스를 자동으로 찾아야합니다. – SacJn
그리고 struts 프레임 워크를 이미 사용하고 있습니다.이 라이브러리를 사용하면 충돌이 발생할 수 있습니다. 한 가지 더 문제가 있습니다. 원본 및 변환기 클래스는 일부 필드의 이름이 같지 않습니다. – SacJn