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

创建只对特定返回类型可用的自定义方法级注释[AOP]

孙凌龙
2023-03-14

我想创建一个注释,它只对特定类型的返回值可用。

例如,这是我的注释。

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface MyAnnotation {

}

我也有一个接口:

public interface MyInterface {
    String generateKey();
}
public class ExampleClass implements MyInterface {

@Override
public String generateKey() {
   return "Whatever";
    }
}
@MyAnnotation
public ExampleClass anExampleMethod() {
    return new ExampleClass();
}
@MyAnnotation
public String anotherMethod() {
    return "Whatever";
}

共有1个答案

经佐
2023-03-14

助手类:

这些直接来自您的示例,只是带有包名和导入。

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 MyAnnotation {}
package de.scrum_master.app;

public interface MyInterface {
  String generateKey();
}
package de.scrum_master.app;

public class ExampleClass implements MyInterface {
  @Override
  public String generateKey() {
    return "Whatever";
  }
}

类的新实例,不应使用该实例编译:

package de.scrum_master.app;

public class Application {
  @MyAnnotation
  public MyInterface annotatedMethodReturningInterface(int number) {
    return new ExampleClass();
  }

  @MyAnnotation
  public ExampleClass annotatedMethodReturningImplementingClass() {
    return new ExampleClass();
  }

  @MyAnnotation
  public String annotatedMethodReturningSomethingElse() {
    // This one should not compile!
    return "Whatever";
  }

  public MyInterface nonAnnotatedMethodReturningInterface(int number) {
    return new ExampleClass();
  }

  public ExampleClass nonAnnotatedMethodReturningImplementingClass() {
    return new ExampleClass();
  }

  public String nonAnnotatedMethodReturningSomethingElse() {
    return "Whatever";
  }
}
package de.scrum_master.aspect;

import de.scrum_master.app.MyAnnotation;
import de.scrum_master.app.MyInterface;

public aspect AnnotationCheckerAspect {
  declare error :
    @annotation(MyAnnotation) && execution(* *(..)) && !execution(MyInterface+ *(..)) :
    "Method annotated with @MyAnnotation must return MyInterface type";
}

此方面检查

  • 所有方法执行
  • 其中方法具有@myAnnotation
  • 但是返回类型与MyInterface或任何子类型或实现类不同。

这就是Eclipse中的结果:

package de.scrum_master.aspect;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.DeclareError;

@Aspect
public class AnnotationCheckerAspect {
  @DeclareError(
    "@annotation(de.scrum_master.app.MyAnnotation) && " +
    "execution(* *(..)) && " +
    "!execution(de.scrum_master.app.MyInterface+ *(..))"
  )
  static final String wrongSignatureError =
  "Method annotated with @MyAnnotation must return MyInterface type";
}
    null
 类似资料:
  • 问题内容: 注释如何与Java一起使用?以及如何创建这样的自定义注释: 基本上,我需要保留的POJO在持久化时像这样进行序列化: 这样,实际的生成/持久对象是这样的: 任何想法如何实现这一点? 问题答案: 如果创建自定义注释,则必须使用此处的 API 示例进行处理。您可以参考如何声明注释。 这是Java中的示例注释声明的样子。 并被称为。 表示您想在运行时保留注释,并且可以在运行时访问它。 表示您

  • 本文向大家介绍创建自定义的Java注解类的方法,包括了创建自定义的Java注解类的方法的使用技巧和注意事项,需要的朋友参考一下  如果你已经在使用Java编程,并且也使用了任何像Spring和Hibernate这样的流行框架,那么你应该对注解的使用非常地熟悉。使用一个现有框架工作的时候,通常使用它的注解就够了。但是,你是不是也有时候有要创建属于你自己的注解的需求呢? 不久之前,我找到了一个自己创建

  • 我在代码中使用Lombok自动生成getter和setter代码。我想添加其他个人注释并使用它。 例如,我想添加一个方法来验证列表中是否存在一个键: 创建注释后,我将执行以下操作:

  • 现有的答案很好地解释了如何在方法执行时间日志中使用自定义注释。我想知道是否有办法对类和方法使用相同的注释,但是点切应该在使用它的地方有所不同。 若注释用于类,那个么类中的所有方法都应该考虑在方面类中记录执行时间(比如

  • 我读了很多关于这个问题的文章,我确实找到了一些处理它的文章——但不幸的是,我不能真正理解如何解决我的问题。 现在我正在创建WebService(使用Tomcat 7),我想共享接口。我有大约8个相互关联的接口。例如: 问题是,在创建WAR(用于接口C)文件并尝试在tomcat中部署webservice后,tomcat出现了一个错误,如下所示: 严重:WSSERVLET11:无法分析运行时描述符:c

  • 问题内容: 一个项目需要大量使用以下Jackson注释组合。因此,有没有一种方法可以创建另一个注释来避免丑陋的复制/粘贴: 更新: 我已经尝试过了,但是没有成功:-( 问题答案: 使用解决问题: