要限制目标方面,可以使用AspectJ的切入点表达式来选择要应用方面的目标。下面是一个示例:
TargetClass
:public class TargetClass {
public void method1() {
System.out.println("Method 1");
}
public void method2() {
System.out.println("Method 2");
}
}
AspectClass
,并在该类中定义切入点和通知:import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
@Aspect
public class AspectClass {
@Pointcut("execution(* TargetClass.method1(..))")
private void targetMethod() {}
@Before("targetMethod()")
public void beforeTargetMethod(JoinPoint joinPoint) {
System.out.println("Before method 1");
}
}
在上述示例中,@Pointcut
注解定义了一个切入点表达式,该表达式选择了TargetClass
类的method1
方法。@Before
注解定义了一个前置通知,该通知在切入点方法执行之前执行。
main
方法的主类,例如MainClass
,并在该类中使用AspectJ配置和运行目标类:import org.aspectj.lang.*;
import org.aspectj.lang.annotation.*;
import org.aspectj.weaver.loadtime.Agent;
public class MainClass {
public static void main(String[] args) {
TargetClass target = new TargetClass();
target.method1(); // 触发切入点方法
// 在运行时启用AspectJ
AspectClass aspect = new AspectClass();
AspectJProxyFactory proxyFactory = new AspectJProxyFactory(target);
proxyFactory.addAspect(aspect);
TargetClass proxy = proxyFactory.getProxy();
proxy.method1(); // 触发切入点方法
proxy.method2(); // 不会触发切入点方法
}
}
在上述示例中,我们创建了一个TargetClass
对象并调用了method1
方法,这将触发切入点方法。
然后,我们使用AspectJProxyFactory
创建了一个代理对象,并将AspectClass
添加为方面。通过代理对象调用method1
方法,将再次触发切入点方法。但是,调用method2
方法时不会触发切入点方法。
以上示例展示了如何使用AspectJ限制目标方面。您可以根据自己的需求修改切入点表达式和通知类型来实现不同的目标方面限制。