gpt4 book ai didi

java - 如何使用aspectj获取封闭类型

转载 作者:行者123 更新时间:2023-11-30 03:18:10 25 4
gpt4 key购买 nike

请考虑这一点:

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 中使用方面j来获取 B 的封闭类型,因为我需要测试 中包含的某些属性一个对象

最佳答案

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

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

我不确定你想要的是否有任何实际意义,但是你可以用一些开销来做手动引用簿记,如下所示:

  • 每当将感兴趣的对象分配给成员变量时,通过 set() 切入点拦截它,并通过将其放入切面维护的集合中来记住它。
  • 顺便说一句,同时,如果(且仅当!)不再引用旧的成员对象,您还必须从集合中删除旧的成员对象。
  • 在您的 execution() 切入点中,查明相关对象是否在内部集合中,从集合中检索有关拥有对象的信息,并对其进行任何您喜欢的操作.

关于java - 如何使用aspectj获取封闭类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32012654/

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