eclipse使用AspectJ时,在@Before修饰的方法中对该类的成员变量赋值后,在PointCut所在方法中获取该成员变量为空
时间: 2024-03-23 11:36:14 浏览: 26
这个问题可能是因为AspectJ使用的是动态代理,会对目标对象进行代理,所以在@Before修饰的方法中对该类的成员变量赋值后,实际上是对代理对象中的成员变量进行了赋值,而在PointCut所在方法中获取该成员变量时,实际上是获取的目标对象中的成员变量,因此获取到的是空值。
解决这个问题的方法是,在@Before修饰的方法中获取目标对象,然后通过目标对象来对成员变量进行赋值。例如:
```
@Before("execution(* com.example.demo.service.*.*(..))")
public void before(JoinPoint joinPoint) {
Object target = joinPoint.getTarget();
if (target instanceof DemoService) {
DemoService service = (DemoService) target;
service.setMemberVariable("value");
}
}
```
这样就可以在PointCut所在方法中获取到赋值后的成员变量了。
相关问题
@Before(@annotation)打到私有方法上时不起效
是的,@Before注解只会作用于public方法上。这是因为AOP是通过动态代理实现的,而动态代理只能代理public方法。如果想要在私有方法上使用AOP,可以考虑使用AspectJ框架,它可以在编译时或者运行时通过字节码增强的方式实现AOP,不受访问修饰符的限制。但是这种方式需要引入AspectJ的编译器或者运行时库,因此会增加项目的复杂度。
@pointcut 排除指定方法
您可以使用AspectJ来排除指定方法。AspectJ是一个Java AOP框架,可以用于在编译时或运行时植入切面,以实现对目标代码的增强和修改。
要排除指定方法,您可以使用AspectJ中的`!execution()`指示符。下面是一个示例:
```java
// 定义切面类
public aspect ExcludeMethodsAspect {
// 匹配所有类中的所有方法,除了指定的方法
pointcut allMethodsExceptSome():
execution(* *(..)) && !execution(* com.example.ExcludedClass.excludedMethod(..));
// 在切面执行前执行
before(): allMethodsExceptSome() {
// 在这里编写您想要执行的代码
}
}
```
在上面的示例中,`allMethodsExceptSome`切点匹配所有类中的所有方法,但排除了`com.example.ExcludedClass`类中的`excludedMethod`方法。您可以根据需要修改切点的定义。
请注意,要使用AspectJ,您需要在项目中添加AspectJ的相关依赖,并且需要将AspectJ编译器集成到构建过程中。具体的配置和使用方式可以参考AspectJ的官方文档或其他相关资源。