如何使用aspectj获取封闭类型

时间:2015-08-14 14:37:32

标签: java aspectj

请考虑一下:

public class A
{
  private B bMemeber;
  private Properties myProperties;
}

public class B { 
 private Object field;
 public void setField(Object o){...}
}

我有一个方面

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

我的问题是:是否可以在B中使用aspectj获取封闭类型afterSetField,因为我需要测试A对象中包含的某些属性

1 个答案:

答案 0 :(得分:2)

你想要的东西不容易实现,因为它不是AOP的制作方式。 B类的实例不知道它是分配给任何其他类的成员还是任何集合或数组的一部分。 JVM垃圾收集器为内部目的引用计数(在不再引用对象后释放内存),但这不是您从一个方面可以访问的内容。您可以使用AspectJ做什么

    只要将值或对象分配给成员变量(set())切入点或者读取该成员(get()切入点),就会
  • 拦截。顺便说一句,这些切入点不适用于局部变量,仅适用于成员。但是当一个方法被调用到碰巧被分配给成员变量的任何对象时,从技术上讲,变量的值不会改变,它仍然是相同的(可变的)对象,即方法调用或内部状态改变在引用的对象中,不会在引用对象中触发set(),仅在引用的对象本身中触发。{/ li>
  • 拦截方法调用或执行,您已经这样做了。

我不确定你想要什么具有任何实际意义,但你可以用一些开销来做这样的手动参考簿记:

  • 每当感兴趣的对象被分配给成员变量时,通过set()切入点截取它并通过将其放入由该方面维护的集合中来记住它。
  • 顺便说一句,同时你还必须从集合中删除旧的成员对象,如果(并且只有!)它不再被引用。
  • execution()切入点中,查看相关对象是否在内部集合中,从集合中检索有关拥有对象的信息,并随意使用它。

我希望即使没有示例代码,这种解释也是可以理解的。随意提出后续问题。