拦截方法声明

Intercept method declaration

我有以下方法:

@OnEvent
public void onEvent(Event event) {
}

现在,我很困惑 AspectJ 是否可以拦截方法 "declaration",即既不是它的调用也不是它的执行,以便在其他地方提供功能。 objective 是 "take" 该方法并将其作为事件处理程序注册到 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);
}

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

  • 在方面应该开始的所有地方都放置标记注释怎么样?您可以在那里对注释进行参数化,以提及要调用的方法。
  • 或者,如果您真的想将所有内容集中在一个地方并避免使用配置文件,请使用类似于 Spring 的配置 class。 class 或您在启动组件时调用的它的方法之一,将携带所有配置注释,因此可以被 AspectJ 拦截。
  • 你也可以保留注解在原处,在加载class后调用注解的方法一次,拦截方法执行并从一个方面记录方法,然后在以后重新使用这些信息.

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

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

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