暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Java 注解

Hello 帅帅 2021-02-05
1279

内置注解

作用在代码中的注解

注解作用
@Override检查该方法是否是重写方法。如果发现其父类,或者是引用的接口中并没有该方法时,会报编译错误
@Deprecated标记过时方法。如果使用该方法,会报编译警告
@SuppressWarnings指示编译器去忽略注解中声明的警告。
@SafeVarargs忽略任何使用参数为泛型变量的方法或构造函数调用产生的警告。
@FunctionalInterface标识一个匿名函数或函数式接口

作用在其他注解的注解(或者说元注解)是:

注解作用
@Retention标识这个注解怎么保存,是只在代码中,还是编入class文件中,或者是在运行时可以通过反射访问
@Documented标记这些注解是否包含在用户文档中
@Target标记这个注解应该是哪种 Java 成员
@Inherited标记这个注解是继承于哪个注解类(默认 注解并没有继承于任何子类)
@Repeatable标识某注解可以在同一个声明上使用多次

@SafeVarargs:

     public class SafeVarargsTest {
    public static void main(String[] args) {
    ArrayList<Integer> a1 = new ArrayList <>();
    a1.add(1);
    a1.add(2);
    showArgs(a1, 12);
    }
    //如果没有此注解,会报出警告
    @SafeVarargs
    public static <T> void showArgs(T... array) {
    for (T arg : array) {
    System.out.println(arg.getClass().getName() + ":" + arg);
    }
    }
    }

    输出:

       java.util.ArrayList:[1, 2]
      java.lang.Integer:12

      源码:

         @Documented
        @Retention(RetentionPolicy.RUNTIME)
        @Target({ElementType.CONSTRUCTOR, ElementType.METHOD})
        public @interface SafeVarargs {}

        • @Documented
          :表明该注解可以包含在用户文档中。

        • @Retention(RetentionPolicy.RUNTIME)

        • @Target({ElementType.CONSTRUCTOR, ElementType.METHOD})
          :

        RetentionPolicy:

        枚举常量说明
        SOURCEAnnotation信息仅存在于编译器处理期间,编译器处理完之后就没有该Annotation信息了
        CLASS编译器将Annotation存储于类对应的.class文件中。默认行为
        RUNTIME编译器将Annotation存储于class文件中,并且可由JVM读入
           package java.lang.annotation;
          public enum RetentionPolicy {
          SOURCE,
          CLASS,
          RUNTIME
          }

          ElementType:

          枚举常量说明
          TYPE类、接口(包括注解类型)或枚举声明
          FIELD字段声明(包括枚举常量)
          METHOD方法声明
          PARAMETER参数声明
          CONSTRUCTOR构造方法声明
          LOCAL_VARIABLE局部变量声明
          ANNOTATION_TYPE注释类型声明
          PACKAGE包声明
          TYPE_PARAMETER类型参数声明
          TYPE_USE类型的使用
          MODULE模块声明
          RECORD_COMPONENT记录组件
             package java.lang.annotation;
            public enum ElementType {
            TYPE,
            FIELD,
            METHOD,
            PARAMETER,
            CONSTRUCTOR,
            LOCAL_VARIABLE,
            ANNOTATION_TYPE,
            PACKAGE,
            TYPE_PARAMETER,
            TYPE_USE,
            MODULE,
            @jdk.internal.PreviewFeature(feature=jdk.internal.PreviewFeature.Feature.RECORDS,essentialAPI=true)
            RECORD_COMPONENT;
            }

            自定义注解

            属性:接口中的抽象方法

            要求:

            1. 属性的返回值类型有下列取值

              • 基本数据类型

              • String

              • 枚举

              • 注解

              • 以上类型的数组

            2. 定义了属性,在使用时需要给属性赋值

              1. 如果定义属性时,使用default关键字给属性默认初始化值,则使用注解时,可以不进行属性的赋值。

              2. 如果只有一个属性需要赋值,并且属性的名称是value,则value可以省略,直接定义值即可。

              3. 数组赋值时,值使用{}包裹。如果数组中只有一个值,则{}可以省略

            MyAnno

               @Documented
              @Retention(RetentionPolicy.RUNTIME)
              @Target(ElementType.TYPE)
              public @interface MyAnno {
              String name() default "wenwen";
              int age();
              }

              Person

                 @MyAnno(name = "xiaowenwen", age = 11)
                public class Person {
                private String name;
                private int age;
                @Override
                public String toString() {
                return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
                }
                public Person() {
                }
                public void setName(String name) {
                this.name = name;
                }
                public void setAge(int age) {
                this.age = age;
                }
                }

                Test1

                   public class Test1 {
                  public static void main(String[] args) {
                  Person person = new Person();
                  try {
                  //获取Person的Class对象
                  Class<Person> personClass = Person.class;
                  //判断person对象上是否有 MyAnno注解
                  if (personClass.isAnnotationPresent(MyAnno.class)) {
                  MyAnno myAnno = personClass.getAnnotation(MyAnno.class);
                  person.setName(myAnno.name());
                  person.setAge(myAnno.age());
                  System.out.println(person);
                  } else {
                  System.out.println("Person类上没有配置 MyAnno注解!");
                  }
                  } catch (Exception e) {
                  e.printStackTrace();
                  }
                  }
                  }


                  最后修改时间:2021-02-05 15:08:14
                  文章转载自Hello 帅帅,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                  评论