gpt4 book ai didi

java - AspectJ - 多个@annotation切入点

转载 作者:行者123 更新时间:2023-11-29 05:22:28 25 4
gpt4 key购买 nike

我不能用“||”做一个切入点运算符和多个注释。我正在尝试为一些 JBehave 注释(@Given、@Then、@When)创建切入点。

这很好用:

    @Pointcut("@annotation(given)")
public void jBehaveGivenPointcut(Given given) { }

如果我围绕它创建并提出建议,它也会起作用。

为三个注释制作切入点的语法是什么?因为我在其他切入点中使用了逻辑 OR 运算符,所以我假设它是这样的:

    @Pointcut("@annotation(given) || @annotation(then) || @annotation(when) ")
public void jBehaveGivenPointcut(Given given, Then then, When when) { }

但它不起作用,我得到一个不一致的绑定(bind)异常。我尝试了其他组合,但找不到能解决问题的组合。

最佳答案

你想要的不能以这种方式完成,因为正如错误消息所说,注解绑定(bind)不一致:你不能同时绑定(bind)所有三个注解,因为它们位于(可能互斥)或切入点的部分,也就是说,通常只有其中一个可以绑定(bind)(除非您将多个注释分配给同一方法)。您的期望可能是 AspectJ 可以通过将 null 分配给其他两个绑定(bind)来处理这种不一致,但这不是编译器现在的工作方式。

我可以提供一个涉及反射而不是使用 @annotation() 绑定(bind)的解决方法。

司机申请:

package de.scrum_master.app;

import org.jbehave.core.annotations.Given;
import org.jbehave.core.annotations.Then;
import org.jbehave.core.annotations.When;

public class Application {
public static void main(String[] args) {
doGiven("foo");
doSomething("bar");
doWhen(11);
doSomethingElse(22);
doThen();
}

@Given("an input value") public static void doGiven(String string) {}
@When("I do something") public static void doWhen(int i) {}
@Then("I should obtain a result") public static boolean doThen() { return true; }
public static void doSomething(String string) {}
public static void doSomethingElse(int i) {}
}

看点:

package de.scrum_master.aspect;

import java.lang.annotation.Annotation;
import java.lang.reflect.Method;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;

@Aspect
public class JBehaveInterceptor {
@Pointcut("execution(@org.jbehave.core.annotations.* * *(..))")
public void jBehavePointcut() {}

@Before("jBehavePointcut()")
public void jBehaveAdvice(JoinPoint.StaticPart thisJoinPointStaticPart) {
Method method = ((MethodSignature) thisJoinPointStaticPart.getSignature()).getMethod();
for (Annotation jBehaveAnnotation : method.getAnnotations()) {
if (jBehaveAnnotation.annotationType().getPackage().getName().equals("org.jbehave.core.annotations"))
System.out.println(thisJoinPointStaticPart + " -> " + jBehaveAnnotation);
}
}
}

如您所见,切入点仅拦截由 org.jbehave.core.annotations.* 注释的方法,这大大缩小了切入点匹配的范围 - 不仅仅是 @Given@When@Then,但也许这就是您想要的,因为 JBehave 提供的注解远不止这些。

在建议中,我们遍历所有方法注释,因为可能不仅仅是 JBehave 注释。如果任何注释包名称与相应的 JBehave 包匹配,我们就会做一些事情(在这种情况下将注释打印到标准输出)。

希望这能解决您的问题。我无法为您扩展 AspectJ 语言,这是我能想到的最好的。无论如何,这会产生以下输出:

execution(void de.scrum_master.app.Application.doGiven(String)) -> @org.jbehave.core.annotations.Given(priority=0, value=an input value)
execution(void de.scrum_master.app.Application.doWhen(int)) -> @org.jbehave.core.annotations.When(priority=0, value=I do something)
execution(boolean de.scrum_master.app.Application.doThen()) -> @org.jbehave.core.annotations.Then(priority=0, value=I should obtain a result)

关于java - AspectJ - 多个@annotation切入点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24127169/

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