我建议阅读此博客条目(archive.org上的快照),直到作者记得他可以使用Spring的组件扫描功能为止。
最初的问题是扫描类路径以查找具有自定义批注的类。完成此操作后,您将在独立应用程序中拥有对象,通过使用
object.getClass().getAnnotations(),您可以将需要添加到包含自定义批注的对象中的侦听器或自定义行为注入。
假设您具有以下自定义注释:
@Target({ ElementType.TYPE })@Retention(RetentionPolicy.RUNTIME)public @interface MyMessageDriven {}然后在应用程序中使用某些类:
@MyMessageDrivenpublic class MyObject {}现在,在应用程序中的适当位置,您应该有一个方法可以给出所有带有
MyMessageDriven以下内容的类:
Set<Class<?>> findAllMessageDrivenClasses() { final StopWatch sw = new StopWatch(); sw.start(); final Reflections reflections = new Reflections("org.projectx", new TypeAnnotationsScanner()); Set<Class<?>> allMessageDrivens = reflections.getTypesAnnotatedWith(MyMessageDriven.class); // NOTE HERE sw.stop(); return allMessageDrivens;}有了这个,我假设您的应用程序中有一点(1)您可以访问应用程序中的对象,或者(2)应用程序中所有对象上都有访问者或迭代器模式。因此,在某种程度上,我假设我们所有目标对象都为
objects:
Set<Class<?>> msgDrivenClasses = findAllMessageDrivenClasses();for (Object o : objects) { if (msgDrivenClasses.contains(o.getClass()) { invokeTheMessageListener(o); }}另一方面,
MyMessageListener当
MyMessageDriven找到具有的对象时,应该可以使用一些实现:
void invokeTheMessageListener(Object o) { theMessageListener.onMessage(o);}此答案是根据博客条目量身定制的,因此请参考博客以获取库的配置。最后但并非最不重要的一点是,这是该问题的示例代码,可以将其重构为更兼容模式和优雅的样式。
更新 :有一个要求, 目标
对象应了解其自己的侦听器。因此,我建议采用以下方法。让我们有一个接口
MyMessageListenerAware:
interface MyMessageListenerAware { MyMessageListener getMyMessageListener();}// and this is the original MyMessageListenerinterface MyMessageListener { void onMessage(Object o);}现在,目标对象应实现上述接口:
class MySampleObject implements MyMessageListenerAware { public MyMesssageListener getMyMessageLisener() { return mySampleObjectImplementationOfMyMessageListener; }}有了这个,方法
invokeTheMessageListener就变成了:
void invokeMessageListener(Object o) { if (o instance MyMessageListenerAware) { MyMessageListener l = ((MyMessageListenerAware) o).getMyMessageListener(); l.onMessage(o); }}虽然
,但我强烈建议阅读有关访问者或策略模式的信息。在我看来,您想要做的事情似乎是您需要某些对象对应用程序中的常见对象/事件做出反应/动作/过程,但
每个 对象 都有 自己的解释/算法/实现。



