在没有反射的情况下以一种很好的方式更改类的特定字段

时间:2018-04-16 16:26:42

标签: java reflection

我需要转换Request类中的许多(但不是全部)对象字段,并且我试图以一种很好的方式进行。不时需要转换的字段正在发生变化。

这就是Request类的样子:

public class Request {
    private FinancialParameters financialParameters;
    private AdditionalParameters additionalParameters;
}

public class FinancialParameters {
    private BigDecimal financialParam1;
    private BigDecimal financialParam2;
    (...)
    private BigDecimal financialParam99;
    private BigDecimal financialParam100;
}

public class AdditionalParameters {
    private BigDecimal additionalParam1;
    private BigDecimal additionalParam2;
    (...)
    private BigDecimal additionalParam99;
    private BigDecimal additionalParam100;
}

这就是我现在正在做的事情。这需要数百行代码。并且很难毫无错误地改变转换后的字段。

class ParamConverter {

    public Request convert(Request request){

    request.getFinancialParameters().setFinancialParam1(convert(request.getFinancialParameters().getFinancialParam1()));
    request.getFinancialParameters().setFinancialParam3(convert(request.getFinancialParameters().getFinancialParam3()));
    request.getFinancialParameters().setFinancialParam5(convert(request.getFinancialParameters().getFinancialParam5()));
    request.getFinancialParameters().setFinancialParam6(convert(request.getFinancialParameters().getFinancialParam6()));
    request.getAdditionalParameters().setAdditionalParam2(convert(request.getAdditionalParameters().getAdditionalParam2()));
    request.getAdditionalParameters().setAdditionalParam3(convert(request.getAdditionalParameters().getAdditionalParam3()));
    request.getAdditionalParameters().setAdditionalParam8(convert(request.getAdditionalParameters().getAdditionalParam8()));
    request.getAdditionalParameters().setAdditionalParam9(convert(request.getAdditionalParameters().getAdditionalParam9()));
    request.getAdditionalParameters().setAdditionalParam10(convert(request.getAdditionalParameters().getAdditionalParam10()));
    (...)
    return request;
    }
}

有没有办法做得更好?我唯一的想法是制作一个需要更改的字段列表,并使用反射更改它。 例如:

List<String> filedsToChange = Arrays.asList(
"FinancialParameters.financialParam1",
"FinancialParameters.financialParam3",
"FinancialParameters.financialParam5",
"FinancialParameters.financialParam6",
"AdditionalParameters.AdditionalParam10",
);

但它可以做得更好,没有反思吗?可以通过使用自定义注释注释字段来完成吗?

1 个答案:

答案 0 :(得分:0)

尝试使用HashMap!

HashMap<String, BigDecimal> paramMap

地图有两个基本部分,一个是键和一个值。您可以将每个参数名称设置为地图中的键,该值包含“参数”信息。

有了这个,你可以为你运行的任何程序提供一些“参数”(可以像字符串一样简单),然后它会将地图用作一种“密码”,并允许你获得特定的数据和基于参数的信息。

干杯!