当前位置: 首页 > 知识库问答 >
问题:

切入点匹配注释的参数值

邵飞宇
2023-03-14

假设我有一个注释,如下所示:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface DBOperation
{
    boolean isReadOperation() default true;
}

然后在Aspect中,我怎么可能想写两个切入点,一个用于所有用@DB操作(isRead操作=true)注释的方法,一个用于@DB操作(isRead操作=false)?

共有1个答案

东方权
2023-03-14

语法实际上非常简单。这是一个MCVE:

标记批注:

package de.scrum_master.app;

import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

import java.lang.annotation.Retention;
import java.lang.annotation.Target;

@Retention(RUNTIME)
@Target(METHOD)
public @interface DBOperation {
  boolean isReadOperation() default true;
}

驱动程序应用:

package de.scrum_master.app;

public class Application {
  public static void main(String[] args) {
    Application application = new Application();
    application.doSomething();
    application.readValue("name");
    application.writeValue("name", "John Doe");
  }

  public void doSomething() {}

  @DBOperation
  public int readValue(String fieldName) {
    return 11;
  }

  @DBOperation(isReadOperation = false)
  public String writeValue(String fieldName, Object value) {
    return "dummy";
  }
}

方面:

package de.scrum_master.aspect;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;

@Aspect
public class DBOperationAspect {
  @Before("execution(@de.scrum_master.app.DBOperation(isReadOperation=true) * *(..))")
  public void interceptRead(JoinPoint joinPoint) throws Throwable {
    System.out.println("Read operation: " + joinPoint);
  }

  @Before("execution(@de.scrum_master.app.DBOperation(isReadOperation=false) * *(..))")
  public void interceptWrite(JoinPoint joinPoint) throws Throwable {
    System.out.println("Write operation: " + joinPoint);
  }
}

控制台日志:

Read operation: execution(int de.scrum_master.app.Application.readValue(String))
Write operation: execution(String de.scrum_master.app.Application.writeValue(String, Object))
 类似资料:
  • 问题内容: 如果满足以下条件,则需要创建一个与方法匹配的切入点的方面: 它用MyAnnotationForMethod注释 它的参数之一(可以有多个)用@MyAnnotationForParam注释(但也可以具有其他注释)。 方面类看起来像这样 注释方法 随着日食->警告:在poincut: 使用http://download.eclipse.org/tools/ajdt/35/update中的最

  • 我试图围绕使用自定义注释注释的方法定义一个切入点。注释有一个参数,我想在切入点定义中包含一个检查。 这是注释: 如何应用注释的示例: 现在我想有两个切入点定义,根据注释的内容选择这两种方法。 在注释本身上创建切入点相对容易: 这将匹配@MyAnno的每次出现。但是我如何定义两个切入点,一个将与包含的匹配,另一个将与包含的匹配

  • 我想使用ElementType运行一个方面。参数注释,但它不起作用。从不调用about-tokenize方法。

  • 我有一个使用< code>Process注释定义的流程。此批注具有名为< code>name的属性。流程中包含任务。这些任务是用另一个名为< code>Task的注释定义的。此批注具有属性< code>processName。我有一个将< code>name作为泛型的泛型流程。此流程的任务是任务1、任务2和任务3,这三个任务都将< code>processName作为通用任务。我可以使用aspec

  • 假设我有这样一种方法: 是否有一个切入点表达式可以选择所有参数带有@CustomAnnotation注释的方法?如果是这样的话,有没有一种方法可以让我访问“value”参数?

  • 到目前为止,我已经尝试了以下表达式,但没有成功: 有人能给我指出正确的解决办法吗?有可能吗?