Java 如何使用aspectj获取封闭类型 请考虑这一点: public class A { private B bMemeber; private Properties myProperties; }

Java 如何使用aspectj获取封闭类型 请考虑这一点: public class A { private B bMemeber; private Properties myProperties; },java,aspectj,Java,Aspectj,及 我有一个方面 @After("execution(* B.setField(..)) &&! within(PropertiesAspect)") public void afterSetField(JoinPoint jp) {....} 我的问题是:在我的afterSetField中使用aspectj是否可以获得B的封闭类型,因为我需要测试A对象中包含的一些属性,因为它不是AOP的用途,所以您想要的不容易实现。类B的实例不知道它是分配给任何其他类

我有一个方面

    @After("execution(* B.setField(..)) &&! within(PropertiesAspect)")
    public void afterSetField(JoinPoint jp)
    {....}

我的问题是:在我的
afterSetField
中使用aspectj是否可以获得
B
的封闭类型,因为我需要测试
A
对象中包含的一些属性,因为它不是AOP的用途,所以您想要的不容易实现。类B的实例不知道它是分配给任何其他类的成员还是任何集合或数组的一部分。JVM垃圾收集器出于内部目的进行引用计数(在对象不再被引用后释放内存),但这不是您可以从方面访问的内容。使用AspectJ可以做的是

  • 每当将值或对象分配给成员变量(
    set()
    )切入点)或读取该成员(
    get()
    切入点)时进行截取。顺便说一下,这些切入点不适用于局部变量,只适用于成员。但是,当一个方法被调用到任何碰巧被分配给成员变量的对象时,从技术上讲,该变量的值不会改变,它仍然是同一个(可变)对象,即,方法调用或被引用对象中的内部状态改变不会触发引用对象中的
    set()
    ,仅在被引用对象本身中
  • 拦截方法调用或执行,您已经这样做了
我不确定你想要的东西是否有实际意义,但你可以用一些开销来做手工参考簿记,如下所示:

  • 每当感兴趣的对象被分配给成员变量时,通过
    set()
    pointcut截取它,并通过将其放入aspect维护的集合来记住它
  • 顺便说一句,同时,如果(且仅当!)旧成员对象不再被引用,您还必须将其从集合中移除
  • execution()
    切入点中,找出所涉及的对象是否在内部集合中,从集合中检索有关所属对象的信息,并对其执行任意操作

我希望这个解释即使没有示例代码也能理解。请随时提出后续问题。

您的意思不是封闭类型,因为我们这里不讨论内部类。不管怎样,我知道你的意思。请参阅下面我即将给出的答案。
    @After("execution(* B.setField(..)) &&! within(PropertiesAspect)")
    public void afterSetField(JoinPoint jp)
    {....}