gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 06:33:53 25 4
gpt4 key购买 nike

我需要在运行时阅读所有用特定注释(比如@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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com