java注解

java注解

定义:注解,也叫元数据。一种代码级别的说明。它是jdk1.5后引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。

作用分类:

编写文档:通过代码里标识的元数据生成文档【生成文档doc】

代码分析:通过代码里标识的元数据对代码进行分析

编译检查:通过代码里标识的元数据让编译器能够实现基本的编译检查

JDK内置注解

  • @Overide
    • 检测该注解标注的方法是否是继承自父类的接口
  • @Deprecated
    • 将该注解标注的内容标注为已过时
  • @SuppressWannings
    • 压制警告

      package anno;

      @SuppressWarnings("all")
      public class Demo {

      @Override
      public String toString() {
          return super.toString();
      }
      
      @Deprecated
      public void say() {
      
      }
      
      
      public void eat() {
      
      }
      

      }

自定义注解

自定义注解的形式很简单

package anno;

public @interface Anno {
    
}

通过反编译才做可以看到自定义的注解是继承自java.lang.annotation.Annotation的接口

注解的属性

接口中可以定义的成员方法

package anno;

public @interface Anno {
    public abstract String name();
}
  • 要求:
    • 属性的返回值类型:

      • 基本数据类型
      • String
      • 枚举
      • 注解
      • 以上类型的数组
    • 定义了属性,在使用时要给属性赋值
      package anno;

      public class Demo {

        @Anno(name = "666")
        public void say() {
            System.out.println("hello");
        }
      

      }

    • 当定义的属性有default关键字的时候。可以不给属性赋值
      package anno;

      public @interface Anno {
      public abstract String name();
      public abstract int age() default 10;
      }

    • 如果只有一个属性需要赋值,属性的名字为value时,则value可以不写,直接赋值。

元注解

描述注解的注解

  • @Target:描述注解能够作用的位置
    • @Target({ElementType.FIELD, ElementType.METHOD, ElementType.TYPE})
      public @interface Anno {
          public abstract String name();
      
          public abstract int age() default 10;
      }
      
      ElementType.FIELD: 作用在属性上
      ElementType.METHOD:作用在方法上
      ElementType.TYPE:作用在类上
  • @Retention:描述注解被保留的阶段
  • @Document:描述注解是否被抽取到api文档中
  • @Inherited: 描述注解是否被子类继承

解析注解

获取注解中定义的属性值

package anno;

@Anno(name = "ivy", age = 20)
public class Test {
    public static void main(String[] args) {
        Class<Test> testClass = Test.class;
        Anno annotation = testClass.getAnnotation(Anno.class);
        System.out.println(annotation);  // @anno.Anno(age=20, name="ivy")
        System.out.println(annotation.name());  // ivy
        System.out.println(annotation.age()); // 20
    }
}

package anno;

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

@Target({ElementType.FIELD, ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Anno {
    public abstract String name();

    public abstract int age() default 10;
}
原文地址:https://www.cnblogs.com/ivy-blogs/p/13610527.html