针对静态方法的“target()”切入点的 AspectJ 警告“Xlint:adviceDidNotMatch”

M.M*_*ark 5 java aspectj

我是 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); }
Run Code Online (Sandbox Code Playgroud)

在主要方法中,我有:

Christkind.nextYear(population);
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

kri*_*aex 0

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

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

Christkind.nextYear(population);
Run Code Online (Sandbox Code Playgroud)

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

请随意询问相关的(!)后续问题。