java-如何使用AspectJ访问私有字段?

我正在研究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常量访问私有字段并不是一个干净的解决方案.如果将来某个时候变量的名称发生更改或被删除,则外观将中断.

上一篇:java-依赖注入到Spring非托管bean中


下一篇:java – Spring Aspectj @Before所有休息方法