Java 截取方法声明

Java 截取方法声明,java,osgi,aspectj,Java,Osgi,Aspectj,我有以下方法: @OnEvent public void onEvent(Event event) { } 现在,我很困惑AspectJ是否可以拦截方法“声明”,即它的调用和执行,以便在其他地方提供功能。 目标是“采用”该方法,并将其注册为OSGi服务注册表中的事件处理程序: public void start(BundleContext bc) { bc.registerService(EventHandler.class, new EventHandler() {

我有以下方法:

@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);
}

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

  • 把标记注释放在所有方面应该起作用的地方怎么样?在这里,您可以对注释进行参数化,以便说明要调用哪个方法
  • 或者,如果您真的希望将所有内容都放在一个地方并避免配置文件,请使用类似于Spring的配置类。在启动组件时调用的类或其方法之一将携带所有配置注释,因此AspectJ可以拦截这些注释
  • 您还可以将注释保留在原处,并在加载类后调用一次带注释的方法,截取方法执行并从一个方面记录该方法,然后在以后重新使用该信息
还有其他类似的选择。但在每种情况下,请注意

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

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

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

  • 把标记注释放在所有方面应该起作用的地方怎么样?在这里,您可以对注释进行参数化,以便说明要调用哪个方法
  • 或者,如果您真的希望将所有内容都放在一个地方并避免配置文件,请使用类似于Spring的配置类。在启动组件时调用的类或其方法之一将携带所有配置注释,因此AspectJ可以拦截这些注释
  • 您还可以将注释保留在原处,并在加载类后调用一次带注释的方法,截取方法执行并从一个方面记录该方法,然后在以后重新使用该信息
还有其他类似的选择。但在每种情况下,请注意

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

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

我想我会尝试为我的OSGi环境构建一个自定义编织钩子。我想我会尝试为我的OSGi环境构建一个自定义编织钩子。