使以下静态初始化建议通用时出现错误

问题描述 投票:0回答:1

由于以下给出的建议仅适用于特定类别

@Before("staticinitialization(org.mazouz.aop.Main1)")

我尝试使建议变得通用,以便它可以适用于任何包

@Before("staticinitialization(*.*.*(..))")

我收到以下错误

Syntax error on token "staticinitialization(*.*.*(..))", ")" expected
aop aspectj aspect
1个回答
0
投票

如果您查看 AspectJ 文档和您自己的第一个示例,您会注意到

statitinitialization
采用表示类型名称的切入点模式,而不是任何类型的方法或构造函数调用,这是有意义的,因为您试图拦截静态类初始化,您只有类名可以使用。

您还应该使用更简单的模式而不是

*.*.*
,例如
*
(所有课程)或
org.acme.my_app..*

最后但并非最不重要的一点是,在使用与切面类本身匹配的全局模式时,您需要排除切面本身。否则你会得到如下错误:

Exception in thread "main" java.lang.ExceptionInInitializerError
    at de.scrum_master.app.Application.<clinit>(Application.java:1)
Caused by: org.aspectj.lang.NoAspectBoundException: de.scrum_master.aspect.MyAspect
    at de.scrum_master.aspect.MyAspect.aspectOf(MyAspect.aj:1)
    at de.scrum_master.aspect.MyAspect.<clinit>(MyAspect.aj:1)
    ... 1 more

这是一个MCVE

package de.scrum_master.app;

public class Application {
  public static void main(String[] args) {
    System.out.println("Hello world!");
  }
}
package de.scrum_master.aspect;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;

@Aspect
public class MyAspect {
  @Before("staticinitialization(*) && !within(MyAspect)")
  public void beforeAdvice(JoinPoint joinPoint) {
    System.out.println(joinPoint);
  }
}

控制台日志:

staticinitialization(de.scrum_master.app.Application.<clinit>)
Hello world!
© www.soinside.com 2019 - 2024. All rights reserved.