当前位置: 首页 > 面试题库 >

@AspectJ切入点,用于使用注释覆盖接口方法的方法

伍光济
2023-03-14
问题内容

如何编写适用于方法执行的AspectJ切入点,该方法执行会使用注释覆盖接口方法?例如:

interface A {
  @MyAnnotation void method();
}
class B implements A {
  void method();
}

execution(@MyAnnotation * *.*(..))仅当B.method()带有注释本身时,切入点才匹配。还有另一种方法吗?


问题答案:

正如Nicholas指出的那样,这在AspectJ中是不可能的。这是无法实现的更多证据(摘自http://www.eclipse.org/aspectj/doc/released/adk15notebook/annotations-
pointcuts-and-
advice.html

注释继承和切入点匹配部分):

根据Java
5规范,不继承非类型注释,并且只有具有@Inherited元注释的类型注释才被继承。对c2.aMethod的调用(在您的示例中为b.method())不匹配,因为修饰符(可见性修饰符,注释和throws子句)的连接点匹配基于连接点的主题(方法实际上被调用)。

经历过同样的问题后,我编写了一个小的方法/库,使您可以为此类方法编写切入点。这是您的示例的工作方式:

myAnnotationIsExecuted(): execution(public * *.*(..)) && 
             if(implementsAnnotation("@MyAnnotation()", thisJoinPoint));

要么

myAnnotationIsExecuted(): execution(public * A+.*(..)) &&
             if(implementsAnnotation("@MyAnnotation()", thisJoinPoint));

该方法implementsAnnotation(String,JoinPoint)来自库;一种基本方法,用于检查实现的方法是否包含指定的批注。

可以在此处找到有关方法/库的更多信息。



 类似资料:
  • 我试图拦截一个用JAX-RS@POST标注的接口方法。我的切入点适用于所有非接口方法,如果@POST-注释直接位于被调用的方法。 拦截的接口方法: 要匹配方法的PointCut: 接口在v1com.myapp.social.webapi.包中,即使我将方法更改为公共AeyJ也不会拦截调用。 在我的切入点内有什么需要改变的吗?我怎样才能让它工作?

  • 我想拦截所有java。sql。数据源。getConnection方法使用aspectj时,我使用了以下切入点: 它工作得很好。但我遇到了一些类,例如org。阿帕奇。公猫jdbc。水塘在该切入点不起作用的类层次结构中实现的数据源,其中数据源方法位于不实现数据源的层次结构中的类中,只有最顶层的类实现数据源: BaseDataSource不实现DataSource,但具有所有DataSource方法实现

  • 服务实现 但是,如果我将注释移动到公共接口方法实现,我的方面就会被触发。我应该如何定义我的切入点或配置我的方面来使我的原始用例工作?

  • 我正在使用Spring的AspectJ和CGLIB代理。我有一个定义如下的方面,我希望它在具体的类上为公共方法提供建议,这些类是用批注“validatormethod”批注的:

  • add:如果我将方法存根添加到Fragment2中,就可以开始使用next annotation,但这是一个非常难看的解决方案 解决方案:多亏了@Kriegaex,我找到了解决方案:

  • 使用加载时间编织,纯AspectJ。 我们有2个注释和,以及一些带注释的方法。 现在我正在为具有多个注释的定义自己的围绕方面: 这行不通。然而,捕获方法myMethod2可以很好地用于单个注释: 我只想捕获签名中同时存在时间和计数注释的方法,并且我想使用注释值。有人知道如何做到这一点吗?