首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java -注册所有使用@MyAnnotation注释的类

Java -注册所有使用@MyAnnotation注释的类
EN

Stack Overflow用户
提问于 2011-05-05 05:18:47
回答 5查看 9.7K关注 0票数 6

我有一个注释@MyAnnotation,我可以用它注释任何类型(类)。然后我有一个名为AnnotatedClassRegister的类,我希望它注册所有用@MyAnnotation注释的类,这样我以后就可以访问它们了。如果可能的话,我想在创建AnnotatedClassRegister时自动注册这些类,最重要的是在实例化带注释的类之前。

我有AspectJ和Guice可供我使用。到目前为止,我想出的唯一解决方案是使用Guice将AnnotatedClassRegister的单例实例注入到一个方面,该方面搜索所有用@MyAnnotation注释的类,并在其构造函数中添加注册此类所需的代码。这种解决方案的缺点是,我需要实例化每个带注释的类,以便由AOP添加的代码能够实际运行,因此我不能利用这些类的延迟实例化。

我的解决方案的简化伪代码示例:

代码语言:javascript
复制
// This is the class where annotated types are registered
public class AnnotatedClassRegister {
    public void registerClass(Class<?> clz) {
        ...
    }
}

// This is the aspect which adds registration code to constructors of annotated
// classes
public aspect AutomaticRegistrationAspect {

    @Inject
    AnnotatedClassRegister register;

    pointcutWhichPicksConstructorsOfAnnotatedClasses(Object annotatedType) : 
            execution(/* Pointcut definition */) && args(this)

    after(Object annotatedType) :
            pointcutWhichPicksConstructorsOfAnnotatedClasses(annotatedType) {

        // registering the class of object whose constructor was picked 
        // by the pointcut
        register.registerClass(annotatedType.getClass())
    }
}

我应该使用什么方法来解决这个问题?有没有什么简单的方法可以通过反射在类路径中获得所有这样的带注释的类,这样我就根本不需要使用AOP了?或任何其他解决方案?

任何想法都非常感谢,谢谢!

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-05-05 05:39:23

这是可能的:

  1. 获取类路径中的所有路径。解析System.getProperties().getProperty("java.class.path", null)以获取所有路径。
  2. 使用ClassLoader.getResources(path)获取所有资源并检查类:
票数 7
EN

Stack Overflow用户

发布于 2011-05-05 05:37:22

这并不简单,但我会用一种纯Java的方式来做:

使用此位置从classpath

  • Create a

  • 对象获取应用程序的Jar位置,为每个以.class结尾的条目遍历条目

  • 执行一次Class.forName()以获取类对象

  • 通过反射读取批注。如果存在,请将类存储在列表中或设置

方面在这方面对您没有帮助,因为方面只对实际执行的代码起作用。

但是annotation processing可能是一种选择,创建一个处理器来记录所有带注释的类,并创建一个类来提供这些类的列表

票数 4
EN

Stack Overflow用户

发布于 2011-05-05 22:35:09

好吧,如果您的AnnotatedClassRegister.registerClass()不必在AnnotatedClassRegister创建时立即调用,但它可以等到类第一次实例化时再调用,那么我会考虑使用Guice TypeListener,它注册到一个Matcher,用于检查类是否带有@MyAnnotation注释。

这样,您不需要搜索所有这些类,它们将在使用前注册。请注意,这只适用于由Guice实例化的类。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5890003

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档