在java层,我还定义了一个可以获五个字段的类
/** * 规则号 */ public String ruleNo; /** * 公司账套 */ @RuleDtlTypeInfo(value ="30") private String businessBook; /** * 公司账套名称 */ private String businessBookDesc; /** * 机构级别 */ @RuleDtlTypeInfo(value ="31") private String branchLevel; /** * 机构名称 */ private String branchLevelDesc; /** * 所在预算中心 */ @RuleDtlTypeInfo(value ="32") private String placeBudgetCenter; /** * 所在预算中心名称 */ private String placeBudgetCenterDesc;
......等等
可以发现我为每个写了注解
/**功能描述:该注释是用来标识使用该注释的字段是属于规则明细设置表中哪种类型
* @author fangjunjie.wb
* @date 2020/4/22
* @return
*/
@Target( { ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
public @interface RuleDtlTypeInfo {
/**
* 规则明细类型值
*
* @return
*/
String value();
}
最后根据反射解析五个字段(貌似不知5个)核心代码如下,需要保存的字段我都添加了@RuleDtlTypeInfo
@Override
public List<RuleDetailSetDomain> analysisFilterMask(Object o,String ruleNo) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
List<RuleDetailSetDomain> ruleDetailSetDomainList=new ArrayList<RuleDetailSetDomain>();
Field[] field = o.getClass().getDeclaredFields();
for (int i = 0; i < field.length; i++) {
//获取注解的规则明细类型,如果字段没有添加RuleDtlTypeInfo注解,则不进行保存
RuleDtlTypeInfo ruleDtlTypeInfo= field[i].getAnnotation(RuleDtlTypeInfo.class);
if (ruleDtlTypeInfo!=null){
RuleDetailSetDomain ruleDetailSetDomain=new RuleDetailSetDomain();
String ruleDtlNo = commonService.getSequence("BEPRULE", "RULE_DETAIL_SET", "RULE_DETAIL_NO");
ruleDetailSetDomain.setRuleNo(ruleNo);
ruleDetailSetDomain.setRuleDetailNo(ruleDtlNo);
ruleDetailSetDomain.setRuleDtlType(ruleDtlTypeInfo.value());
// 获取属性的名字
String name = field[i].getName();
// 将属性的首字母大写
Method m = o.getClass().getMethod("get" + StringUtil.UpperFirst(name));
// 调用getter方法获取属性值
String ruleDtlValue = (String) m.invoke(o);
ruleDetailSetDomain.setRuleDtlValue(ruleDtlValue);
ruleDetailSetDomainList.add(ruleDetailSetDomain);
}
}
return ruleDetailSetDomainList;
}