首页 > 解决方案 > 转换和复制对象的所有属性

问题描述

我有一个包含很多字段的大型每月摘要对象。创建新的时,我需要计算上个月每个字段的金额/百分比差异,如下所示:

public Summary addSummary(Summary current) {
   Summary previous = getPreviousSummary(getPreviousMonth();

   current.setPropertyA(NumUtil.getFormattedValue(current.getPropertyA(), previous.getPropertyA()));
   // repeat 80 more times

   ...
}

目前我正在手动进行,这既乏味又超级丑陋,有没有办法在通过函数运行它们之后循环遍历所有属性/设置它们?

我做了一些搜索,BeanUtils 可以复制属性,但不能转换它们。

标签: java

解决方案


您可以使用反射来解决您的问题。由于我实际上不知道您将从这两个对象中获取和设置什么,因此我将举一个最小的示例来说明在这种情况下您可以做什么。

您可以获得Summary类中所有声明的字段,如下所示:

Field[] arrayOfFields = Summary.class.getDeclaredFields();

由于您拥有类摘要的所有字段,因此您可以遍历每个字段并轻松地为该类的不同对象执行获取和设置,如下所示。field.setAccessible(true)如果字段在类中是私有的,请记住设置:

for (Field field: arrayOfFields) {
    try {
        field.setAccessible(true);
        if (field.getType() == Double.class) {
            Double prevVal = field.get(previous);
            Double currentVal = field.get(current);
            //do calculation and store to someval
            field.set(resultSummary, someval);
        }
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }
}

好吧,您可能需要检查您的班级Summary拥有的所有类型的班级,并根据该类型进行获取和设置。请记住,您不能将原始类型字段用于此if条件检查,因为它们不是类。因此,您可能需要将类中的原始类型变量转换summary为相应的 Object Class。喜欢等等doubleDouble

field.get(Object obj)方法获取 Object 中字段的值obj。同样,field.set(Object obj, Object value)将 Object 设置为 Objectvalue中的字段obj

使用这种方法,您可以通过更少的麻烦和动态编码轻松实现目标。


推荐阅读