gpt4 book ai didi

java - 拦截方法声明

转载 作者:太空宇宙 更新时间:2023-11-04 11:41:38 24 4
gpt4 key购买 nike

我有以下方法:

@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 拦截。
  • 您还可以将注释保留在原来的位置,并在加载类后调用一次带注释的方法,拦截方法执行并从某个方面记下该方法,然后在以后重新使用此信息。

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

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

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

关于java - 拦截方法声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42732506/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com