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

赫克托

我正在研究AspectJ它的许多用途,并已发现mixins

我可以找到许多使用纯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()并允许我查看中设置的值的Aspect / mixin 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常量访问私有字段并不是一个干净的解决方案。如果将来某个时候变量的名称发生更改或被删除,则外观将中断。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

休眠状态如何访问私有字段?

使用伪类访问私有字段

使用反射访问 golang 中包的私有字段

Java:使用私有字段进行对象访问

在静态工厂方法中使用覆盖方法创建实例时,如何访问封闭类中的私有字段?

如何在不使用 setter 的情况下从子类访问超类中的私有字段?

访问类模块中的私有字段

从不同的模块访问私有字段

访问私有字段进行junit测试

访问 Companion 对象中的私有字段

访问自己的子类对象的私有字段

访问和编辑私有字段值

如何在VS Code中使用JavaScript私有字段?

如何对私有字段使用short get set?

如何使用List <T>()隐藏私有字段?

如何在TypeScript中使用私有字段?

如何使用 lombok SuperBuilder 访问超类的私有变量

如何使用Java访问私有类成员?

Docker:如何使用ssh访问私有的github仓库?

如何使用ssh在flutter中访问私有仓库包?

如何使用OpenLayers从Geoserver访问私有层?

如何使用反射访问私有方法?

如何仅使用函数访问私有变量

如何在Java中通过BeanInfo <I>访问私有字段

子类的构造函数如何访问超类的私有字段变量?

如何在Java中通过反射访问父类的父类的私有字段?

如何从Xamarin Forms中的另一个ContentPage访问/继承私有字段属性?

如何从Delphi 10.1 Berlin中的班级助手访问私有字段?

如何防止外部类方法访问嵌套类的私有定义方法或字段?