美文网首页
Android 学习(三):Java 注解

Android 学习(三):Java 注解

作者: 翟小乙 | 来源:发表于2021-09-26 14:50 被阅读0次

    上一篇 Android 学习(二):Java 反射

    Java注解学习

    学习内容

    1. 元注解
    2. 自定义注解
    3. 通过反射获取注解信息
    • 注解是JDK1.5 引入的新特性,大部分框架(如Spring)都用注解简化代码并提高编码的效率。
    • @Override 重写,标识覆盖它的父类的方法
    • @Deprecated 已过期,表示方法是不被建议使用的
    • @SuppressWarnings 告诉编译器忽略指定的警告

    Annotation通常在package,Class,Field,Method上,目的是与其他的类,成员变量,方法区分开来或者说做一个标识。

    • 注解的定义:通过@interface 关键字进行定义。
      它的形式跟接口很类似,不过签名多了一个 @ 符号 例如:
    // 定义一个注解
    public @interface MyTestApplication {
    
    }
    
    1. 元注解

    JDK提供的几个特殊注解,只能用在注解上面

    • @Target :表示该注解可以用于什么地方,取值如下:
    1. ElementType.ANNOTATION_TYPE 可以给一个注解进行注解
    2. ElementType.CONSTRUCTOR 可以构造方法进行注解
    3. ElementType.FIELD 可以给属性进行注解
    4. ElementType.LOCAL_VARIABLE 可给局部变量进行注解
    5. ElementType.METHOD 可给方法进行注解
    6. ElementType.PACKAGE 可给包进行注解
    7. ElementType.PARAMETER 可给一个方法内的参数进行注解
    8. ElementType.TYPE 可给一个类型进行注解,比如类,接口,枚举
    例子:

    例子前提:
    -@Target是用在注解上,下面例子是注解所有没有问题
    -ElementType内的标识,给注解进行详细说明

    • 注解声明:
    // 给注解设置一个元注解
    @Target(ElementType.TYPE)  //并且设置该注解类型为类,接口,枚举等等
    public @interface MyTestApplication {
    
    }
    
    • 注解使用
    @MyTestApplication   // 注解使用
    public class Animal {
      private String name;
      public Animal () {
      }
      private void setName (String name) {
           this.name = name;
      }
      private String getName (){
          return this.name;
      }
    }
    
    • @Retention:表示注解传递存活时间。取值如下:
    1. RetentionPolicy.SOURCE 注解只在源码阶段保留,编译器编译时它将被丢弃
    2. RetentionPolicy.CLASS 注解只被保留到编译进行的时候,它并不会被加载JVM中
    3. RetentionPolicy.RUNTIME 注解可保留到程序运行时被加载到JVM中,因此可通过反射机制读取注解的信息
    例子:

    例子前提:
    -@Retention是用在注解上,注解传递存活时间

    -RetentionPolicy内的标识,给注解进行详细说明

    • 注解声明:
    @Target(ElementType.TYPE) //可给一个类型进行注解,比如类,接口,枚举
    @Retention(RetentionPolicy.RUNTIME) //注解可保留到程序运行时被加载到JVM
    public @interface MyTestApplication {
    
    }
    
    • 注解使用:
    @MyTestApplication   // 注解使用
    public class Animal {
      private String name;
      public Animal () {
      }
      private void setName (String name) {
           this.name = name;
      }
      private String getName (){
          return this.name;
      }
    }
    
    • @Document:将注解中的元素包含到Javadoc中
    • @Inherited:允许子类继承父类的注解
    1. 如父类Animal有一个注解@Test,且@Test 注解有@Inherited 注解,那么该父类Animal的子类Cat也默认有@Test注解
    2. 自定义注解
    • 例子学习:
    public class Test {
    // 注解可以显示赋值,如果没有默认值,必须给注解赋值
     @MyAnnotation (name = "注解传参",schools = {"西北大学", “西南大学”})
     public void test() {
         
    }
    }
    // 声明一个注解 下面是 声明注解一个标准
    @Target(ElementType.TYPE,ElementType.METHOD)
    @Retention(RetentionPolicy.RUNTIME)
    @interface MyAnnotation {
          // 注解的参数 : 参数类型 + 参数名 (); 也可以给默认值
          String name()  defalut "";
          int age() defalut 0;
          int id() defalut -1;// 如果默认值为 -1 ,代表不存在
          String[] schools() defalut {"西北", “西南”};
    }
    
    3. 通过反射获取注解信息
    • 声明类注解
    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface ClassAnimalAnnotation {
               String value();
    }
    
    • 声明属性注解
    @Target(ElementType.METHOD)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface FieldAnimalAnnotation {
               String dbName();
    }
    
    • 声明modle且使用注解
    @ClassAnimalAnnotation(value = "db_animal")
    public class Animal {
      @FieldAnimalAnnotation(dbName = "db_name")
      private String name;
      public void setName(String name) {
                this.name = name;
      }
      public void getName() {
              return this.name;
      }
    }
    
    • 根据反射获取注解
      1.获取类注解 肯定先获取到该类
      2.获取属性注解 肯定先获取到该成员变量Field
    public class RunAnimal {
          public  static void main(Strings[] args) {
            // 通过反射 获取 类对象
            Calss<?>  clas =  Class.forName("包名.Animal");
           // 通过类对象 获取注解 ===》 获取指定注解值
    
         // 1.获取类注解 肯定先获取到该类
          ClassAnimalAnnotation classAnimalAnnotation =(ClassAnimalAnnotation) clas .getAnnotation(ClassAnimalAnnotation.class);
          System.out.println(classAnimalAnnotation.value()) // 打印结果:db_animal
        // 2.获取属性注解 肯定先获取到该成员变量Field
                            // 方法一  
           Filed field = clas.getDeclaredField("name");
           FieldAnimalAnnotation fieldAnimalAnnotation =  field.getAnnotation(FieldAnimalAnnotation.class);
           System.out.println(fieldAnimalAnnotation .dbName()) // 打印结果:db_name
                            // 方法二 获取所有成员变量Field
          }
    }
    

    下一篇 Android 学习(四):Android APT/Android 编译时技术

    相关文章

      网友评论

          本文标题:Android 学习(三):Java 注解

          本文链接:https://www.haomeiwen.com/subject/bpszgltx.html