注解原理:
* Retention注解的说明:
* 1.RetentionPolicy.SOURCE注解只保留在源文件(.java文件)
* 2.RetentionPolicy.CLASS:注解被保留到class文件,但jvm加载class文件时候被遗弃,默认值(.class文件)
* 3.RetentionPolicy.RUNTIME:注解被保存到class文件中,jvm加载class文件之后仍然存在(内存中的字节码)
* 4.首先要明确生命周期长度 SOURCE < CLASS < RUNTIME ,所以前者能作用的地方后者一定也能作用。一般如果需要在运行时去动态获取注解信息,那只能用 RUNTIME 注解;
* value注解的说明:
* 1.ElementType.TYPE:接口、类、枚举、注解
* 2.ElementType.FIELD:字段、枚举的常量
* 3.ElementType.METHOD:方法
* 4.ElementType.PARAMETER:方法参数
* 5.ElementType.CONSTRUCTOR:构造函数
* 6.ElementType.LOCAL_VARIABLE:局部变量
* 7.ElementType.ANNOTATION_TYPE:注解
* 8.ElementType.PACKAGE:包
代码实现如下:
1.创建注解文件ExportFieldAnnotation,如下:
@Retention(RetentionPolicy.RUNTIME)
@Target(value = ElementType.FIELD)
public @interface ExportFieldAnnotation {
String value();
short color() default MyIndexedColors.YELLOW;
}
2.在对应的VO等实体文件中的引用,如下:
@ApiModelProperty(value = "状态")
@ExportFieldAnnotation(value = "状态",color = MyIndexedColors.PINK)
private String licenseNum;
@ApiModelProperty(value = "车型")
@ExportFieldAnnotation(value = "车型")
private String trucksName;
3.获取实体参数中对应ExportFieldAnnotation的值,如下:
public static Map<String, Map<String, Object>> getFieldAnnotation(Object object) {
Field[] fields = object.getClass().getDeclaredFields();
Map<String, Map<String, Object>> resultMap = new LinkedHashMap();
for (Field field : fields) {
boolean bool = field.isAnnotationPresent(ExportFieldAnnotation.class);
if (bool) {
Map<String, Object> map = new HashMap<>();
String value = field.getAnnotation(ExportFieldAnnotation.class).value();
short color = field.getAnnotation(ExportFieldAnnotation.class).color();
map.put(TITLE_VALUE, value);
map.put(TITLE_COLOR, color);
resultMap.put(field.getName(), map);
}
}
return resultMap;
}