首页 > 解决方案 > 针对静态方法的“target()”切入点的 AspectJ 警告“Xlint:adviceDidNotMatch”

问题描述

我是 AspectJ 的新手,并且仍在学习编写代码。我正在尝试为 nextYear() 方法创建切入点和建议,但我不断收到“警告:(39, 0) ajc:在 ChristkindAspect 中定义的建议尚未应用 [Xlint:adviceDidNotMatch]”。我知道这可能是因为没有直接创建对象,并且我无法使用 target(christkind enter code here),但我找不到解决方案。有人可以帮忙吗?先感谢您!

pointcut nextYear(Christkind christkind, Population population):
  call(* *Christkind.nextYear(Population))&& args(population) && 
  target(christkind);


before(Christkind christkind,Population population): nextYear(christkind,population) {
    System.out.println("New Year");
    populationSize(population);
    numbOfWIshes(population);
    //wishStrength(population); }

在主要方法中,我有:

Christkind.nextYear(population);

在此处输入图像描述

标签: javaaspectj

解决方案


警告Xlint:adviceDidNotMatch意味着在方面编织器或编译器范围内没有找到与方面中的切入点匹配的代码。因此,有问题的建议并未应用于(即融入)您的目标应用程序代码。

在您的屏幕截图中,我看到您的目标方法是静态的,您的主要方法调用它的方式也意味着:

Christkind.nextYear(population);

target()切入点指示符检查目标对象是否是您指定的任何实例。但是对于静态方法,没有实例,因此名称为静态方法,而不是实例方法。因此,您的切入点将不匹配。因此,要么使您的方法成为非静态方法(如果您想对目标实例对象执行某些操作),要么您需要使用另一个切入点指示符,例如within(Christkind)。似乎您甚至没有Christkind在建议代码中使用假定的实例,而只使用了Population实例。因此,只需摆脱target()零件或将其替换为within().

随时提出相关(!)后续问题。


推荐阅读