如何使用 aspectj 获取封闭类型
How to get the enclosing type with 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)
{....}
我的问题是:是否可以在我的 afterSetField
中使用 aspectj 获取 B
的封闭类型,因为我需要测试 A
对象中包含的某些属性
你想要的东西不容易实现,因为它不是 AOP 的目的。 class B 的实例不知道它是否被分配给任何其他 class 的成员或者是任何集合或数组的一部分。 JVM 垃圾收集器为内部目的进行引用计数(在对象不再被引用后释放内存),但这不是您从某个方面可以访问的。您可以使用 AspectJ 做的是
- 每当将值或对象分配给成员变量(
set()
)切入点)或读取该成员时(get()
切入点)拦截。顺便说一句,这些切入点不适用于局部变量,仅适用于成员。但是当一个方法被调用到恰好分配给成员变量的任何对象时,从技术上讲,该变量的值不会改变,它仍然是相同的(可变)对象,即方法调用或引用对象的内部状态变化不会在引用对象中触发 set()
,仅在引用对象本身中触发。
- 拦截方法调用或执行,您已经这样做了。
我不确定你想要的有什么实际意义,但你可以用一些开销做的是像这样的手动参考簿记:
- 每当将感兴趣的对象分配给成员变量时,通过
set()
切入点拦截它,并通过将其放入方面维护的集合中来记住它。
- 顺便说一下,如果(且仅当!)不再引用旧成员对象,您还必须同时从集合中删除它。
- 在你的
execution()
切入点中,找出有问题的对象是否在内部集合中,从集合中检索关于拥有对象的信息,然后随意处理它。
我希望即使没有示例代码也能理解这个解释。欢迎提出后续问题。
请考虑这个:
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)
{....}
我的问题是:是否可以在我的 afterSetField
中使用 aspectj 获取 B
的封闭类型,因为我需要测试 A
对象中包含的某些属性
你想要的东西不容易实现,因为它不是 AOP 的目的。 class B 的实例不知道它是否被分配给任何其他 class 的成员或者是任何集合或数组的一部分。 JVM 垃圾收集器为内部目的进行引用计数(在对象不再被引用后释放内存),但这不是您从某个方面可以访问的。您可以使用 AspectJ 做的是
- 每当将值或对象分配给成员变量(
set()
)切入点)或读取该成员时(get()
切入点)拦截。顺便说一句,这些切入点不适用于局部变量,仅适用于成员。但是当一个方法被调用到恰好分配给成员变量的任何对象时,从技术上讲,该变量的值不会改变,它仍然是相同的(可变)对象,即方法调用或引用对象的内部状态变化不会在引用对象中触发set()
,仅在引用对象本身中触发。 - 拦截方法调用或执行,您已经这样做了。
我不确定你想要的有什么实际意义,但你可以用一些开销做的是像这样的手动参考簿记:
- 每当将感兴趣的对象分配给成员变量时,通过
set()
切入点拦截它,并通过将其放入方面维护的集合中来记住它。 - 顺便说一下,如果(且仅当!)不再引用旧成员对象,您还必须同时从集合中删除它。
- 在你的
execution()
切入点中,找出有问题的对象是否在内部集合中,从集合中检索关于拥有对象的信息,然后随意处理它。
我希望即使没有示例代码也能理解这个解释。欢迎提出后续问题。