我正在研究AspectJ及其许多用途,并发现了mixin.
我可以找到许多使用纯AspectJ .aj方面的示例,但是我只需要使用@AspectJ批注.
我要实现的目标如下:
我有一个无法修改的类,它具有一个私有类变量,在完成特定的类方法后,我需要查询该私有类变量.此类没有与此私有类变量关联的getter或setter方法.
public final class CannotAmend {
private Uri privateUri;
public final void methodOne(){}
public final void methodTwo(){}
public final void methodThree(){
privateUri = "something";
}
}
我需要一个可以捕获@After methodThree()并允许我查看privateUri中设置的值的方面/混合.
这有可能实现吗?
有@AspectJ注释吗?
在哪里可以找到实现此目的的文档/教程/示例?
解决方法:
在一个方面,您可以使用反射API访问私有字段.
在这方面,您需要两件事:
>切入点,用于定义方面与之匹配的方法.
>并用@After注释的方法包含在切入点匹配的方法返回之后执行的逻辑.
@Aspect
public class MyAspect {
@Pointcut("execution(* CannotAmend.methodThree(..))")
public void methodThreePointcut(){
}
@After("methodThreePointcut()")
public void afterMethod(JoinPoint joinPoint) throws NoSuchFieldException, IllegalAccessException {
Object instance = joinPoint.getThis();
Field privateUriField = instance.getClass().getDeclaredField("privateUri");
privateUriField.setAccessible(true);
String privateUri = (String) privateUriField.get(instance);
System.out.println(privateUri); // prints "something"
}
}
附带说明一下,使用String常量访问私有字段并不是一个干净的解决方案.如果将来某个时候变量的名称发生更改或被删除,则外观将中断.