【问题标题】:Determine which aspects hook into a given class确定哪些方面挂钩到给定的类
【发布时间】:2011-12-30 19:17:21
【问题描述】:

是否可以确定哪些方面与给定类挂钩并获得对其实例的访问权限?

类似:

Foo foo = new Foo();
List<Object> aspects = getAllAspectsOf(foo);

【问题讨论】:

  • 我不确定您要达到的目标。一方面,成为 foo 的一个方面意味着什么?也许你的意思是当一个通知被执行时,'foo' 将被绑定到 'this()' 切入点。由于切入点可以动态绑定,因此任何此类 getAllAspectsOf(foo) 方法都将取决于哪个线程和 cflow 是什么。我认为您应该考虑使用 perthis 或 pertarget。然后对于给定的 Foo 实例,您可以调用 MyAspect.aspectOf(foo)。见eclipse.org/aspectj/doc/released/progguide/…

标签: java aop aspectj


【解决方案1】:

首先,您很可能无法使用现有的 Aspect API 进行任何此类监控,因为 Aspect 包装器拦截调用的特定目的是不与任何特定组件绑定,因此不会有检测拦截方面的任何自然方式。

也就是说 - 可能有一种方法可以将方面包装在某种策略类中,但是,维护它的工作量将相当大。

http://www.eclipse.org/aspectj/doc/released/faq.php#q:benefits

方面通常被描述为“位于”或“与”其他代码“交织在一起”,即在运行时或构建时。

http://asm.ow2.org/users.html

因此,鉴于实现方面的范例,您的代码通常不会“意识到”任何此类面向方面的功能。

然而,如果你想要可追踪的切面,你可以使用标准的 java 和依赖注入来实现一些切面“类似”的特性——也就是说,通过在运行时加载注入的模块来实现一些跨切割方面将实现的功能......但是,我怀疑,如果您真的在做严肃的面向方面的代码,那么这种方法将达不到您的面向方面的要求。

【讨论】:

    【解决方案2】:

    我不认为你可以,虽然这取决于技术。据我所知,aspectj 或 cglib 无法跟踪和访问围绕类编织的建议。您可以创建您的建议,以便它将对自身的引用添加到可以由建议类访问的某个线程本地结构。但是,如果将目标类与切面结合起来,这似乎违背了切面作为横切关注点的解决方案的目的。

    【讨论】:

    • 我不打算将目标类耦合到方面。相反,我想提供一个带有目标类的策略类,然后策略类需要访问目标类上定义的方面来注册一些监听器。目标类未修改...只有策略类了解方面。
    • @mibollma:您能否让建议注册侦听器,从而不必为目标实例提供策略?
    【解决方案3】:

    我想获得一些有限的信息,它需要更改编织器,因此它将一些工作日志保存到增强类中,以便您以后阅读。但不要期望太多 - AFAIK 方面可能根本不存在,因为没有运行时类型。我想知道 - 有没有这样做的框架?

    【讨论】:

      猜你喜欢
      • 2014-12-07
      • 2010-11-02
      • 1970-01-01
      • 2022-11-23
      • 2016-10-20
      • 2011-02-19
      • 2010-10-30
      • 1970-01-01
      • 2022-11-19
      相关资源
      最近更新 更多