JAVA自定义注解、元注解介绍及自定义注解使用场景

妖狐艹你老母 2021-06-11 15:11 876阅读 0赞

自定义注解会需要元注解,此处先介绍元注解。

元注解

java中有四种元注解:@Retention、@Inherited、@Documented、@Target

@Retention

注解的保留位置(枚举RetentionPolicy),RetentionPolicy可选值:

  • SOURCE:注解仅存在于源码中,在class字节码文件中不包含
  • CLASS:默认的保留策略,注解在class字节码文件中存在,但运行时无法获得
  • RUNTIME:注解在class字节码文件中存在,在运行时可以通过反射获取到

@Inherited

声明子类可以继承此注解,如果一个类A使用此注解,则类A的子类也继承此注解

@Documented

声明注解能够被javadoc等识别(下面自定义注解处会有例子做介绍,点击查看)

@Target

用来声明注解范围(枚举ElementType),ElementType可选值:

  • TYPE:接口、类、枚举、注解
  • FIELD:字段、枚举的常量
  • METHOD:方法
  • PARAMETER:方法参数
  • CONSTRUCTOR:构造函数
  • LOCAL_VARIABLE:局部变量
  • ANNOTATION_TYPE:注解
  • PACKAGE:包

自定义注解介绍

自定义注解使用场景

  1. 类属性自动赋值。
  2. 验证对象属性完整性。
  3. 代替配置文件功能,像spring基于注解的配置。
  4. 可以生成文档,像java代码注释中的@see,@param等

1和2这个没有做过类似实例,应该是像Hibernate中的使用注解映射Bean对象到数据库一样(此处为个人猜测,如有错误请留言指出),中间有检测和自动赋值。

自定义注解定义

定义一个自定义注解(不使用元注解):

  1. public @interface MyAnnotation{ }

定义一个自定义注解(使用元注解,每个元注解都是可选,非必选):

  1. @Retention(RetentionPolicy.RUNTIME)
  2. @Inherited
  3. @Documented
  4. @Target({ElementType.FIELD,ElementType.METHOD})
  5. public @interface MyAnnotation1{
  6. public String name() default "hello";
  7. }

注解中可以声明成员方法,声明的成员方法为最终的注解里面的参数,成员方法可以使用default关键字设置默认值。上面的注解使用如:@MyAnnotation1(name=”ddd”);

自定义注解演示

新建一个自定义注解:

  1. @Retention(RetentionPolicy.RUNTIME)
  2. @Inherited
  3. @Documented
  4. @Target({ElementType.FIELD,ElementType.METHOD})
  5. @interface MyAnno{
  6. public String name() default "zhangsan";
  7. public String email() default "hello@example.com";
  8. }

定义一个User类,来使用自定义注解:

  1. class User{
  2. @MyAnno(name = "zhang")
  3. private String name;
  4. @MyAnno(name = "zhang@example.com")
  5. private String email;
  6. @MyAnno(name = "sayHelloWorld")
  7. public String sayHello(){
  8. return "";
  9. }
  10. }
  • @Documented注解的作用
    定义的MyAnno注解中使用了@Documented注解,现在来看下User类中sayHello方法的javadoc,截图如下:
    这里写图片描述
    能看到@MyAnno注解出现在javadoc中。
    如果不使用@Documented注解,我们看下sayHello方法的javadoc,截图如下:
    这里写图片描述
    发现@MyAnno的提示信息没有了,也就是javadoc不能识别此注解信息了,@Documented注解的作用就很明显能看出来了。
  • 通过反射获取注解信息
    下面我们通过反射来演示下获取属性的注解信息和方法的注解信息:

    Method[] methods = User.class.getMethods();
    //Field[] fields = User.class.getFields();
    Field[] fields = User.class.getDeclaredFields();
    /*

    1. getFields:只能访问public属性及继承到的public属性
    2. getDeclaredFields:只能访问到本类的属性,不能访问继承到的属性
    3. getMethods:只能访问public方法及继承到的public方法
    4. getDeclaredMethods:只能访问到本类的方法,不能访问继承到的方法
    5. getConstructors:只能访问public构造函数及继承到的public构造函数
    6. getDeclaredConstructors:只能访问到本类的构造函数,不能访问继承到的构造函数

    */

    for (Field field : fields) {

    1. MyAnno annotation = field.getAnnotation(MyAnno.class);
    2. if(annotation!=null){
    3. System.out.println("property="+annotation.name());
    4. }

    }
    for (Method method : methods) {

    1. MyAnno annotation = method.getAnnotation(MyAnno.class);
    2. if(annotation!=null){
    3. System.out.println("sayHello="+annotation.name());
    4. }

    }

输出如下:

property=zhang
property=zhang@example.com
sayHello=sayHelloWorld

发表评论

表情:
评论列表 (有 0 条评论,876人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Java 注解定义注解处理器

    注解介绍 注解,也被称为元数据(所谓的元数据,就是描述数据的数据)。 所以注解的主要作用就是给指定代码一些描述信息。这些指定代码可以是一个类、一个方法或者是一个属性。