Java 8 中,怎么获取枚举成员上添加的注解?
写一个简单的注解定义
@Target({ElementType.TYPE, ElementType.FIELD})@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface MyTest {
Excel[] value();
}
然后在枚举成员变量上加上注解
public enum UserAction { USER_ADD,
@MyTest
USER_VIEW
}
我应该怎么写反射才能拿到这个注解,我测试了 UserAction.USER_VIEW.getClass().getAnnotation(MyTest.class),获取不到,我想实现添加注解后,过滤掉枚举成员。
而且奇怪的是,我在UserAction类上加@MyTest注解,编译竟然不通过,我记得ElementType.TYPE之后,是可以给枚举类加注解的吧,求大佬路过解答一下
回答:
咱们首先要明白枚举的本质,它其实本质只是一个语法糖,类似UserAction
最后编译成字节码文件里面大致这个样子
public final class UserAction extends java.lang.Enum{
public static final UserAction USER_ADD;
@MyTest
public static final UserAction USER_VIEW;
public static UserAction[] values();
public static UserAction valueOf(java.lang.String)
}
看了上面这个就明白你为啥那个取不到注解了叭,你可以自己看看UserAction.USER_VIEW.getClass()
实际获取到的是一个Class
,之后操作那这就是获取Class
脑袋上的注解
但是实际你那个注解是注解在字段上的,也就是Field
上
所以正确姿势肯定是要获取到Field
然后再才能获取注解,所以首先获取到所有Fields
,最后再转换成枚举
Field[] fields = UserAction.class.getDeclaredFields();List<UserAction> userActions = Arrays.stream(fields)
.filter(field -> field.isAnnotationPresent(MyTest.class))
.map(Field::getName)
.map(UserAction::valueOf)
.collect(Collectors.toList());
当然个人来讲不是特别推荐这么做,毕竟有点麻烦,而且像你所说UserAction
里枚举很多,只是为了挑选几个枚举出来,但是确实要循环所有的枚举,有丢丢的性能损失,哈哈哈
一般呢,我个人建议还是常规路线处理,就是额外建一个扩展枚举通过属性映射来管理你需要处理的业务,类似下面这样
@Getter@AllArgsConstructor
public enum UserActionExt {
USER_VIEW(UserAction.USER_VIEW, "MyTest"),
;
private UserAction userAction;
private String name;
}
这样你就不用在之前那个枚举改动啦(小心改成屎一样的枚举),以后这个业务新增一些处理也可以加在这个枚举里,并且根据不同业务你也可以再创建更多枚举来扩展不同的业务
当然我们在实际使用这些扩展枚举的时候,往往我们拿到了的是映射那个枚举,比如UserAction.USER_VIEW
,然后需要的是其他属性,比如MyTest
或其他属性,所以我们可以做一个简单的小缓存来加速和方便我们的使用
@Getter@AllArgsConstructor
public enum UserActionExt {
USER_VIEW(UserAction.USER_VIEW, "MyTest"),
;
private UserAction userAction;
private String name;
public static final Map<UserAction, UserActionExt> CACHE = Arrays.stream(UserActionExt.values())
.collect(Collectors.toMap(UserActionExt::getUserAction, Function.identity()));
}
然后使用扩展枚举类就很方便啦,比如:
String name = UserActionExt.CACHE.get(UserAction.USER_VIEW).getName();
大概就是这样叭~( ^_^ )/~~拜拜
回答:
你都定义枚举了,你还需要其他参数的话,自己再加参数呗,还需要用注解嘛?
以上是 Java 8 中,怎么获取枚举成员上添加的注解? 的全部内容, 来源链接: utcz.com/p/944122.html