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

时间:2018-12-18 18:07:44

标签: 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); }

在主要方法中,我有:

Christkind.nextYear(population);

enter image description here

2 个答案:

答案 0 :(得分:0)

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

在屏幕快照中,我看到目标方法是静态的,主方法调用它的方式也暗示:

Christkind.nextYear(population);

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

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

答案 1 :(得分:0)

before(): execution(* Packages.*.*(..))
    {
         //packages is com
        System.out.println(" TEST");    

    }

尝试此方法以找到正确的建议