• 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;
    }
  • 相关阅读:
    Postgres窗口函数学习
    关于KMP算法
    Kettle应用实例
    mybatis中po类继承另一个po类时查不出另一个po类里的属性
    查看Mybatis动态SQL
    取每个班前5名成绩的sql
    scatter/gather与map/reduce技术的布道推广从换个说法开始
    神奇的O記
    【坑】软件的大版本的各类小版本支持问题
    oracle时间处理tochar的黑幕坑
  • 原文地址:https://www.cnblogs.com/ivy-blogs/p/13610527.html
Copyright © 2020-2023  润新知