微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

我是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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。