java - AspectJ 在切入点上创建了大量方法

标签 java android aspectj pointcut

我是 AOP 的新手(使用 AspectJ/ajc),并且在互联网上到处搜索/谷歌搜索以寻找我的难题的答案。希望这里有人可能拥有它。

正如我从文档中了解到的那样,AspectJ 应该注入(inject)代码。然而,根据我的经验,它似乎主要是在添加代码(并且只是交换方法调用)。

例如,如果我有方法:

private static int foo() {
    System.out.println("Hello world");
    return 1;
}

我为它定义了以下环绕建议(使用虚拟随机数来操纵 proceed() 与其他一些返回值):

pointcut foo() : call(int com.mytest.aspects.HelloWorld.foo(..));
int around() : foo() {
    System.out.println("around()");
    if (System.currentTimeMillis() % 2 == 0)
        return proceed();
    return 0;
}

使用jd-gui反编译后得到如下信息:

  private static final int foo_aroundBody0()
  {
    return foo();
  }

  public static void main(String[] args)
  {
    foo_aroundBody1$advice(HelloAspect.aspectOf(), null);
  }

  private static final int foo_aroundBody1$advice(HelloAspect ajc$aspectInstance, AroundClosure ajc$aroundClosure)
  {
    System.out.println("around()");
    if (System.currentTimeMillis() % 2L == 0L)
    {
      AroundClosure localAroundClosure = ajc$aroundClosure;return foo_aroundBody0();
    }
    return 0;
  }

  private static int foo()
  {
     System.out.println("Hello world");
     return 1;
  }

如果是这样呢?我是不是做错了什么?

我尝试在我的 android 应用程序中使用 ajc,但是多亏了一些 jar 和 SDK,我遇到了可怕的“太多方法”问题。

我大部分时间都在使用调用切入点,但是这些额外的方法似乎是为每个调用添加的,即使是在同一个类和方法中完成的,因此增加了我的代码大小和方法数量显着。

任何帮助理解这是否正确以及它是如何工作的将不胜感激!

最佳答案

你的理解是正确的。如果你想避免创建太多方法,请尽可能使用 execution() 切入点而不是 call(),因为这样每个被调用者只会创建一个合成方法,不是每个来电者。 IE。如果从 25 个不同的地方调用一个方法,则只会创建一个额外的方法,而不是 25 个。

此外,您可以通过将切面的编织范围限制在真正需要的连接点来避免开销。我看到的大多数方面都融入了太多地方。此外,如果 before()after() 就足够了,请避免使用 around()

关于java - AspectJ 在切入点上创建了大量方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29282936/

相关文章:

java - 我不明白这个 return 语句的行为

java - 无法通过java执行docker命令

java - 如何在 Swing 中制作此 GUI 布局

android - 错误 : cannot find symbol import com. google.android.gms.ads.InterstitialAd

android - SpotsDialog 在 'dmax.dialog.SpotsDialog 中具有私有(private)访问权限

从 DatePicker 中选取值后,Android setError 验证仍然显示。?

spring - 使用Spring框架的AspectJ需要哪些jar?

java - Hibernate Restrictions.isEmpty() 不工作

spring - 带有@Component 注释的@Aspect 如何在幕后工作

spring - Maven、Scala、Spring、AspectJ