通过反射获取字段上的注解
Field[] exportFields = clazz.getDeclaredFields();
for (Field field : exportFields) {
ExcelProperty annotation = field.getAnnotation(ExcelProperty.class);
if (annotation != null) {
int index = annotation.index();
modifyFiled((map)->{
map.put("index", index + 1);
},field);
}
}
以easyExcel的注解为例子,修改index的值
注解在运行时,处理注解是通过注解的代理AnnotationInvocationHandler
memberValues中记录了注解中每个方法对应的属性
可以看到index是默认的-1
想修改这个map的值,就要拿到注解的代理类
ExcelProperty annotation = field.getAnnotation(ExcelProperty.class);
InvocationHandler invocationHandler = Proxy.getInvocationHandler(annotation);
Field annotationValues = invocationHandler.getClass().getDeclaredField("memberValues");
annotationValues.setAccessible(true);
最后拿到map,替换map属性就可以了
Consumer<Map<String, Object>> consumer = new Consumer<Map<String, Object>>() {
@Override
public void accept(Map<String, Object> map) {
map.put("index", index + 1);
}
};
Map<String, Object> map = (Map<String, Object>) annotationValues.get(invocationHandler);
consumer.accept(map);