我想在Java中实现一个基于注释的初始化机制。具体来说,我有一个我定义的注释:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Initialization {
/**
* If the eager initialization flag is set to <code>true</code> then the
* initialized class will be initialized the first time it is created.
* Otherwise, it will be initialized the first time it is used.
*
* @return <code>true</code> if the initialization method should be called
* eagerly
*/
boolean eager() default false;
}
另外,我有一个界面:
public interface SomeKindOfBasicInterface {}
我想找到我的类路径上SomeKindOfBasicInterface
类的每个实现,它在方法上有@Initialization
注释。我正在查看Spring的MetaDataReader
工具,这看起来是推迟加载其他SomeKindOfBasicInterface
实现的最佳方式,而我正在这样做...但我不确定如何进行搜索就像我在描述的那样。有什么提示吗?
答案 0 :(得分:10)
您可以使用Reflections,这是一个Java运行时元数据分析工具。我用它来获取给定类型的所有子类型,但它也可以处理你的情况。
答案 1 :(得分:1)
我基本上会创建一个BeanPostProcessor实现,可能基于CommonAnnotationBeanPostProcessor。然后我设置component-scan来扫描类路径并获取符合您规范的所有bean。初始化bean时,将运行后处理器。
我看到我假设你正在寻找豆子。如果不是这种情况,您可能需要自己扫描类路径。
答案 2 :(得分:1)
您可以使用javassist在类中查找注释,甚至在加载它们之前,但是您需要直接读取.class文件,这可能意味着您自己打开JAR等。此外,您还需要知道在哪里寻找课程。您不能只询问运行时BasicInterface
的所有子类。