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