java - 转换和复制对象的所有属性
问题描述
我有一个包含很多字段的大型每月摘要对象。创建新的时,我需要计算上个月每个字段的金额/百分比差异,如下所示:
public Summary addSummary(Summary current) {
Summary previous = getPreviousSummary(getPreviousMonth();
current.setPropertyA(NumUtil.getFormattedValue(current.getPropertyA(), previous.getPropertyA()));
// repeat 80 more times
...
}
目前我正在手动进行,这既乏味又超级丑陋,有没有办法在通过函数运行它们之后循环遍历所有属性/设置它们?
我做了一些搜索,BeanUtils 可以复制属性,但不能转换它们。
解决方案
您可以使用反射来解决您的问题。由于我实际上不知道您将从这两个对象中获取和设置什么,因此我将举一个最小的示例来说明在这种情况下您可以做什么。
您可以获得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。喜欢等等double
。Double
该field.get(Object obj)
方法获取 Object 中字段的值obj
。同样,field.set(Object obj, Object value)
将 Object 设置为 Objectvalue
中的字段obj
使用这种方法,您可以通过更少的麻烦和动态编码轻松实现目标。
推荐阅读
- powershell - 无法识别术语“Get-MailboxFolderStatistics”
- r - R - 如何使所有数据点在地图中可见
- latex - 乳胶奇怪的脚注编号
- python - Keras 预测和 Sagemaker 预测不同
- r - 如何在R中以“yyyy-mm-dd”的形式获取当前一周的星期五作为日期
- angularjs - 如何在 ui.router 上为 Angular 1 激活其他方式?
- react-native - 将背景图像添加到反应导航抽屉
- c - 编写ac函数,检查一个int数组是否只包含1和2
- javascript - Netlify 向 HTTP 发出 HTTPS 请求
- flutter - '未来的实例
'