当前位置: 首页 > 知识库问答 >
问题:

用自动转换动态复制java中的基元和复杂对象类型字段

孙凌龙
2023-03-14

大多数字段都是复杂的对象类型。

今天可用的库中哪一个可以帮助我复制这些字段,在需要的地方自动转换,并进行深度复制?早些时候,我使用了BeanUtils,但这不是深度复制。也不支持自动转换。

共有1个答案

宗政鸿志
2023-03-14

我认为spring框架可能会有帮助。以下是Spring-Core-4.1.5的示例:

类声明:

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();
    }
 类似资料:
  • 本文向大家介绍C#中的自动类型转换和强制类型转换,包括了C#中的自动类型转换和强制类型转换的使用技巧和注意事项,需要的朋友参考一下 前面已经认识了不同的数据类型,你们有没有尝试过让不同的数据类型进行运算呢? 运行结果是:1 我们把一个整型的变量赋值给了一个浮点型的变量,可以正常的输出,如果我们把一个浮点型的变量赋值给一个整型的变量呢? 这样就会报错。 为什么呢?因为我们之前说过,变量就像一个容器,

  • 我想到这个问题是因为我在某处读到Java不是纯面向对象的语言,因为它使用的是原语(不是对象)。我同意这一点。现在我的问题是,为什么我们使用,而我们已经有了相同类型的对象?

  • 我对这三种代码感到困惑 和 和 我知道第一个是一些包含值的变量,第二个是一些引用不同对象的变量,但是第三个是什么?我知道它们是引用数据类型。 但我不明白为什么和有多少物体被创造出来。。。如果有的话!

  • 本文向大家介绍详解Java多态对象的类型转换与动态绑定,包括了详解Java多态对象的类型转换与动态绑定的使用技巧和注意事项,需要的朋友参考一下 Java多态对象的类型转换 这里所说的对象类型转换,是指存在继承关系的对象,不是任意类型的对象。当对不存在继承关系的对象进行强制类型转换时,java 运行时将抛出 java.lang.ClassCastException 异常。 在继承链中,我们将子类向父

  • 问题内容: 我有一个应用程序,该应用程序使用Jackson将我的复杂对象编组为JSON,从而在DynamoDB中存储一些数据。 例如,我要编组的对象可能如下所示: SomeObject可能看起来像这样: 和SomeOtherObject可能看起来像这样: 可以很好地将对象整理成问题并将其作为JSON字符串存储在数据库中。 当需要从DynamoDB检索数据时,Jackson会自动检索JSON并将其转

  • 某个物体可能看起来像这样: 另一个物体可能是这样的: 这很好,因为对象被封送,没有问题,并以JSON字符串的形式存储在DB中。