拦截方法声明

时间:2017-03-11 07:16:08

标签: java osgi aspectj

我有以下方法:

@OnEvent
public void onEvent(Event event) {
}

现在,我很困惑AspectJ是否可以拦截方法“声明”,即它的调用和执行,以便在其他地方提供功能。 目标是“获取”该方法并将其作为事件处理程序注册到OSGi服务注册表中:

    public void start(BundleContext bc) {
    bc.registerService(EventHandler.class, new EventHandler() {
        @Override
        public void handleEvent(Event event) {
            // TODO get a "reference" of the onEvent(...) method and call it here
            onEventJoinPoint.proceed(event);
        }
    }, null);
}

1 个答案:

答案 0 :(得分:0)

不,这在概念上不可能在AspectJ中,也可能在任何其他AOP框架中。但是你有几种选择:

  • 如何将标记注释放在方面应该启动的所有位置?在那里你可以参数化注释,以便提到要调用的方法。
  • 或者,如果您真的想在一个地方拥有它并避免配置文件,请使用类似于Spring的配置类。在启动组件时调用的类或其中一个方法将带有所有配置注释,因此可被AspectJ拦截。
  • 您还可以将注释保留在原来的位置,并在加载类后调用带注释的方法,拦截方法执行并从一个方面注意方法,然后再重新使用此信息。

还有其他类似的选择。但在每种情况下,请注意

  • 类加载/初始化顺序很重要,
  • 如果你只有一个方法和类名,你需要反射才能调用它,除非该方法是静态的或者类是单例并且该方法不依赖于任何对象状态,即实例可以容易获得并且根据需要经常调用该方法。然后你甚至可以调整解决方案多次调用proceed()

如果您有简单评论过于复杂的后续问题,请更新主要问题并通知我。我现在不能再具体了,因为我对你的用例知之甚少。因此,我还没有提供任何示例代码。