java - 在运行时读取所有用特定注解装饰的类

标签 java reflection annotations cdi

我需要在运行时阅读所有用特定注释(比如@HttpSecurity)装饰的类(接口(interface))。扫描之后,我希望读取和解析用注释装饰的类的字段(枚举字段)。例如。

@HttpSecurity
public interface MyHttpSecurityConfig {

public enum secure {
    @Path(pathGroup = "/*", pathName = "")
    @Authc
    @Form(errorPage = "/error.html", loginPage = "/login.html", restoreOriginalRequest = "")
    @Authz
    @AllowedRoles(roles = { "roleA", "roleB" })
    @AllowedGroups(groups = { "groupA" })
    @AllowedRealms(realms = { "realmA" })
    @Expressions(expressions = { "#{identity.isLoggedIn()}" })
    Admin
  }
}

可能有一个或多个用@HttpSecurity 修饰的类/接口(interface)。 我的第一个要求是获取所有此类类,第二个要求是通过读取注释及其在枚举字段上装饰的值来构建 HttpSecurityBuilder。 第二个要求很好,可以使用反射来消除。但是,我的问题是第一个要求。我想用 JavaSE 核心实现第一个要求,即不使用任何外部依赖项,如谷歌反射。如果有必要,可以假定我们有要扫描的类所在的包名称。这是我使用 cdi 所做的

最佳答案

您可以创建一个 CDI 扩展来观察来自 CDI 注释的扫描并创建您的自定义,如下例所示:

1) 你需要创建一个Qualifier ,通过使用你@HttpSecurity

@Qualifier
@Retention(RUNTIME)
@Target({TYPE, METHOD, FIELD, PARAMETER})
public @interface HttpSecurity {}

2) 您需要通过实现javax.enterprise.inject.spi.Extension接口(interface)来创建扩展:

    package net.mperon.cdi.extension;

    public class MyExtension implements Extension {

    private static final Logger log = LoggerFactory.getLogger(MyExtension.class);

    public <T> void processAnnotatedType(@Observes ProcessAnnotatedType<T> pat) {
        AnnotatedType<T> at = pat.getAnnotatedType();

        //if dont have you anotation, just continue
        if(!at.isAnnotationPresent(HttpSecurity.class)) {
            return;
        }

        //here you can read all annotation from object and do whatever you want:
        log.info("class: {}", at.getJavaClass());
        log.info("constructors: {}", at.getConstructors());
        log.info("fields: {}", at.getFields());
        log.info("methods: {}", at.getMethods());

        //and so more...

    }

3) 可以看到所有的方法和属性here

4) 最后你需要创建一个服务文件,在 META-INF/services 下命名为 javax.enterprise.inject.spi.Extension

5) 在这个文本文件中,你需要把你的扩展全类名,例如:

net.mperon.cdi.extension.MyExtension

关于java - 在运行时读取所有用特定注解装饰的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25395443/

相关文章:

java - Struts Hibernate 与注释集成 (java.lang.NoSuchMethodException)

Hibernate 返回重复,因为另一个表有重复的值

.net - C#。检查 Type 是否为 .NET Framework,而不是我自己的类型

java - 如何使用生成器修改 CssResource 的 css 文件?

JMX 与 htop 报告的 Java 内存

java - 如何向文件中写入不是 8 倍数的位数

java - 为什么 Java 的 String 不能从 Comparable 接口(interface)赋值

java - 在工厂中使用反射

java - Hibernate 中的日期注解

java - 2 个 vector 相减的方向