我正在开发一个传递消息的小应用程序,它们是POJO。我想构建一个可以处理的消息类型的注册表。我最初计划将它们粘贴在枚举类型中,如下所示。
public enum Message
{
INIT( InitMessage.class, "init" ),
REFRESH( RefreshMessage.class, "refresh" );
private Message( Class<?> messageClass, String messageCode )
// etc..
}
我不喜欢这种方法,因为我必须维护一个中心枚举类型来管理允许的类。我更愿意注释POJO。
@MessageDefinition( "init" )
public class InitMessage
{
// .. some properties with appropriate getters and setters
}
我从Subversion检查了Tomcat源代码,甚至在IDE的帮助下,我花了很长时间来浏览抽象层次并得到一些粗暴的代码,告诉我它是如何扫描的webapp中的类搜索注释类以注册@WebServlet,@ WebListener等。更令人反感的是,我只能在测试类中看到对这些注释的引用。
我的问题是注释驱动框架如何扫描注释?很难知道你希望扫描哪些类,甚至更多,在它们被类加载器加载之前。我在想这种方法可能是查找以.class扩展名结尾的所有文件,加载它们并检查注释。然而,这种方法听起来很讨厌。
所以我猜它归结为:
注意:Scan the classpath for classes with custom annotation很棒,但如果可能,我很乐意使用标准Java 7。
更新: 反思不合适。它有大量的依赖关系,更糟糕的是,它依赖于旧版本的库 - 尤其是每个版本都弃用了几十个特性并快速发布的图书馆。
我正在考虑遵循本指南并尽可能使用ASM: http://bill.burkecentral.com/2008/01/14/scanning-java-annotations-at-runtime/
答案 0 :(得分:2)
Tomcat使用缩减扫描注释(因此只有Tomcat需要的位),并重命名包(因此,如果Web应用程序随BCEL一起提供,它也不会发生冲突)Apache Commons BCEL版本。它查找每个.class文件,读取字节代码并提取注释。
有关详细信息,您可以查看源代码。从这个文件的第1130行开始: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/startup/ContextConfig.java?annotate=1537835
另一个流行的做这种事情的库是ASM。