gpt4 book ai didi

java - 匹配特定注释参数值的 aspectj 切入点

转载 作者:行者123 更新时间:2023-11-29 04:23:54 26 4
gpt4 key购买 nike

我正在尝试围绕使用自定义注释注释的方法定义切入点。注释有一个参数,我想在切入点定义中包含一个检查。

这是注释:

public @interface MyAnno {
String[] types;
}

如何应用注释的示例:

public class MyClass {
@MyAnno(types={"type1", "type2"})
public void doSomething() {
// ...
}
@MyAnno(types={"type3"})
public void doSomethingElse() {
// ...
}
}

现在我想要两个切入点定义,它们根据注释的内容选择这两个方法。

在注释本身上创建切入点相对容易:

@Pointcut("@annotation(myAnno)")
public void pointcutAnno(MyAnno myAnno) {
}

@Pointcut("execution(* *(..)) && pointcutAnno(myAnno)")
public void pointcut(MyAnno myAnno) {
}

这将匹配 @MyAnno 的每次出现。但是我如何定义两个切入点,一个匹配 @MyAnno 和包含 "type1"types,另一个匹配 @MyAnno with types 包含 "type3"

最佳答案

当前,AspectJ 支持对允许的注释值类型的子集进行注释值匹配。不幸的是,不支持您使用的数组类型(也不支持类)。此功能记录在 1.6.0 AspectJ 自述文件 (https://eclipse.org/aspectj/doc/released/README-160.html) 中。有一节关于“注释值匹配”。如那里所述,对于基本情况,语法实际上非常直观:

enum TraceLevel { NONE, LEVEL1, LEVEL2, LEVEL3 }

@interface Trace {
TraceLevel value() default TraceLevel.LEVEL1;
}

aspect X {
// Advise all methods marked @Trace except those with a tracelevel of none
before(): execution(@Trace !@Trace(TraceLevel.NONE) * *(..)) {
System.err.println("tracing "+thisJoinPoint);
}
}

因此,只需在注释中包含您要匹配的值即可。不幸的是,数组的情况更复杂,所以还没有实现。它需要更多的语法来允许您指定您的切入点是指“至少是数组值中的这个”还是“恰好是这个并且只有数组值中的这个”。大概会重用 .. 符号,可能是这样的:

execution(@MyAnno(types={"type1"}) * *(..)) { // exactly and only 'type1'
execution(@MyAnno(types={"type1",..}) * *(..)) { // at least 'type1'

如果没有语言支持,恐怕您必须以编程方式挖掘代码中的注释以检查它是否符合您的约束条件。

关于java - 匹配特定注释参数值的 aspectj 切入点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47459062/

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