gpt4 book ai didi

java - 我如何使用 AspectJ 访问私有(private)字段?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:02:59 26 4
gpt4 key购买 nike

我正在研究 AspectJ 及其许多用途,并发现了 mixins

我可以找到许多使用纯 AspectJ .aj 方面的示例,但是我只需要使用 @AspectJ 注释。

我要实现的目标如下:-

我有一个我无法修改的类,它有一个私有(private)类变量,我需要在特定类方法完成执行后询问它。此类没有与此私有(private)类变量关联的 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 中设置的值的方面/mixin。

这有可能实现吗?

使用@AspectJ注解?

我在哪里可以找到有关如何实现此目的的文档/教程/示例?

最佳答案

在一个方面内,您可以使用反射 API 访问私有(private)字段。

在这方面你需要两件事:

  • 用于定义方面匹配的方法的切入点。
  • 还有一个用 @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"
}
}

附带说明一下,使用字符串常量访问私有(private)字段并不是一个干净的解决方案。如果将来某个时候变量的名称发生变化或者它被删除,则方面将会中断。

关于java - 我如何使用 AspectJ 访问私有(private)字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45714298/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com