如何解决如何为类初始化定义切入点
我是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();
}
}
方面:
该方面同时显示initialization
和staticinitialization
,以显示语法和功能上的差异。您可以在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 举报,一经查实,本站将立刻删除。