元注解
@Target 表示注解可以用于哪些地方,CONSTRUCTOR:构造器,FIELD:字段(包括 enum 实例),LOCAL_VARIABLE:变量,METHOD:方法,PACKAGE:包,PARAMETER:参数,TYPE:类、接口(包括注解类型)或者 enum。
@Retention 表示注解信息保存的时长。SOURCE:注解将被编译器丢弃。CLASS:注解在 class 文件中可用,但是会被 VM 丢弃。 RUNTIME:VM 将在运行期也保留注解,可以通过反射机制读取注解。
@Documented 将此注解保存在 Javadoc 中
@Inherited 允许子类继承父类的注解
@Repeatable 允许一个注解可以被使用一次或者多次(Java 8)
注解示例
package com.jay.SpringBootStudy8.annotation;
import java.lang.annotation.*;
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.METHOD})
@Documented
public @interface SelfDicCode {
// 定义枚举
public enum EnumType {
none,
project//项目
}
// 设置默认值
public EnumType classType() default EnumType.none;
}
注解处理
@Test
public void testa() throws Exception {
List<InboundMaster> list = new ArrayList<>();
list.add(new InboundMaster("1", "1", "xxxxxx"));
List<Project> projects = new ArrayList<>();
projects.add(new Project("1", "项目1"));
List<Field> fields = new ArrayList<>();//所有字段,包含父类
Class<?> userClass = InboundMaster.class;
fields.addAll(Arrays.asList(userClass.getDeclaredFields()));
// while (userClass != null) {
// fields.addAll(Arrays.asList(userClass.getDeclaredFields()));
// userClass = userClass.getSuperclass();
// }
//循环字段,获取 SelfDicCode 注解
for (Field field : fields) {
SelfDicCode selfDicCode = field.getAnnotation(SelfDicCode.class);
if (selfDicCode != null) {
field.setAccessible(true);
if (selfDicCode.classType() == SelfDicCode.EnumType.project) {
list.forEach(x -> {
try {
String o = field.get(x).toString();//projectId 1
Project first = projects.stream().filter(s -> s.getId().equals(o)).findFirst().get();
String name = first.getName();
x.getParams().put(field.getName(), name);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
});
}
}
}
list.forEach(System.out::println);
}
浙公网安备 33010602011771号