如何为类初始化定义切入点

问题描述

我是AspectJ的新手,正在尝试了解连接点模型 现在我上了这样的课

public class Account {
 private static Map<String,PaymentMethod> supportedPayments = new HashMap<>();
 static {
   supportedPayments.add("COD",new CodPaymentMethod());
   supportedPayments.add("ATM",new ATMPaymentMethod());
 }
}
正如我从《 AspectJ In Action》中读到的那样,有一种方法可以在类初始化时定义切入点,但是我找不到语法。 有人帮我吗?

这不起作用:

@Pointcut("initialization(com.jas.aop.bean.Payment"))

ERROR] Syntax error on token "initialization(com.jas.aop.bean.Payment)","name pattern" expected
/Users/admin/eclipse-workspace/aop/src/main/java/com/jas/aop/aspect/ClassInitializationAspect.java:9
@Pointcut("initialization(com.jas.aop.bean.Payment)")

解决方法

您的切入点有几个问题:

  • 缺少右括号)
  • initialization拦截构造函数(即对象初始化),而不是静态类初始化,这不是您想要的,并且还需要构造函数模式,而不是类名模式。
  • 如果您的方面与目标类完全不在同一包中,则必须使用完全限定的类名,例如my.package.Account才能使切入点匹配。

顺便说一句,您的代码段只是伪代码,因为哈希映射没有add方法,而没有put方法。示例类甚至不编译。在此处发布问题时,不仅要发明代码。使试图帮助您的人们的生活更加轻松。

现在这里是MCVE,我一直建议您在问题中进行说明,以帮助人们重现您的情况。这次我为您做到了,这是您的免费照片。下次,请自己动手。

主类使用的依赖类:

package de.scrum_master.app;

public interface PaymentMethod {}
package de.scrum_master.app;

public class ATMPaymentMethod implements PaymentMethod {}
package de.scrum_master.app;

public class CodPaymentMethod implements PaymentMethod {}

具有驱动程序应用程序的目标类:

package de.scrum_master.app;

import java.util.HashMap;
import java.util.Map;

public class Account {
  private static Map<String,PaymentMethod> supportedPayments = new HashMap<>();

  static {
    System.out.println("Static initialiser block");
    supportedPayments.put("COD",new CodPaymentMethod());
    supportedPayments.put("ATM",new ATMPaymentMethod());
  }

  public Account() {
    System.out.println("Creating account");
  }

  public void doSomething() {
    System.out.println("Doing something");
  }

  public static void main(String[] args) {
    new Account().doSomething();
  }
}

方面:

该方面同时显示initializationstaticinitialization,以显示语法和功能上的差异。您可以在AspectJ手册中的示例中找到所有这些解释的内容,我热烈建议您阅读。

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 AccountAspect {
  @Before("initialization(de.scrum_master.app.Account.new(..))")
  public void interceptObjectInitialisation(JoinPoint joinPoint) {
    System.out.println(joinPoint);
  }

  @Before("staticinitialization(de.scrum_master.app.Account)")
  public void interceptClassInitialisation(JoinPoint joinPoint) {
    System.out.println(joinPoint);
  }
}

控制台日志:

staticinitialization(de.scrum_master.app.Account.<clinit>)
Static initialiser block
initialization(de.scrum_master.app.Account())
Creating account
Doing something

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...