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

回到顶部