JavaSE 基础(十一)注解

1. 注解的概念

  • Annotation 是从 JDK 5.0 开始引入的新技术。
  • Annotation 的作用
    • 不是程序本身,可以对程序作出解释,这一点和注释(comment)没什么区别。
    • 可以被其他程序(比如:编译器等)读取。
  • Annotation的格式
    • @注解名
    • @注解名(value = “参数值”)
  • Annotation 的使用场合
    • 在package、class、method、field 等上面,相当于给他们添加了额外的辅助信息,我们可以通过反射机制编程实现对这些元数据的访问。

2. 注解的分类

  • Java 内置 7 个注解,3 个在 java.lang 中,4 个在 java.lang.annotation 中。

    • 作用在类、变量或方法的注解:

      • @Override - 检查该方法是否是重写方法。如果发现其父类,或者是引用的接口中并没有该方法时,会报编译错误。

        @Override
        public String toString(){
            return super.toString();
        }
        
      • @Deprecated - 标记过时方法。该方法不推荐使用,但是可以使用,或者说有更好比它的方法。

        @Deprecated
        public static void test(){
            System.out.println("Deprecated");
        }
        public static void main(String[] args) {
            //在 IDEA 中 test 是带有删除线的,表示其是过时方法
            test();
        }
        

        在这里插入图片描述

      • @SuppressWarnings - 指示编译器去忽略注解中声明的警告。

        //参数 all 是忽略所有类型的警告,unchecked 用于抑制未检查的警告
        @SuppressWarnings("all")
        public void test(){
            //list 是一个未使用的变量,在 IDEA 中是灰色,忽略这个警告后变为正常颜色。
            List list = new ArrayList();
        }
        
    • 作用在其他注解的注解,或者说元注解(meta-annotation):

      • @Retention - 标识这个注解怎么保存,是只在代码中,还是编入 class 文件中,或者是在运行时可以通过反射访问,一般都选择 RUNTIMESOURCE < CLASS < RUNTIME) 。

        @Retention(value = RetentionPolicy.RUNTIME)
        @interface Myannotation{ }
        
      • @Documented - 标记这些注解是否包含在用户文档中。

        @Documented
        @interface Myannotation{ }
        
      • @Target - 标记这个注解应该是哪种 Java 成员。

        public class metaTest {
            @Myannotation
            public void test(){ }
        }
        //自定义一个可注解函数的注解
        @Target(value = ElementType.METHOD)
        @interface Myannotation{ }
        /**
         * ElementType 为一个枚举类型数据,元素如下
         * TYPE 意味着,它能标注"类、接口(包括注释类型)或枚举声明"。
         * FIELD 意味着,它能标注"字段声明"。
         * METHOD 意味着,它能标注"方法"。
         * PARAMETER 意味着,它能标注"参数"。
         * CONSTRUCTOR 意味着,它能标注"构造方法"。
         * LOCAL_VARIABLE 意味着,它能标注"局部变量"。
         * ANNOTATION_TYPE 意味着,它能标注"注解"。
         * PACKAGE 意味着,它能标注"包"。
         * TYPE_PARAMETER 1.8 版本新加入的参数。
         * TYPE_USE 1.8 版本新加入的参数。
         */
        
      • @Inherited - 标记这个注解是继承于哪个注解类(默认 注解并没有继承于任何子类)。

        @Inherited
        @interface Myannotation{ }
        
  • Java 7 额外添的 3 个注解:

    • @SafeVarargs - Java 7 开始支持,忽略任何使用参数为泛型变量的方法或构造函数调用产生的警告。

    • @FunctionalInterface - Java 8 开始支持,标识一个匿名函数或函数式接口。

    • @Repeatable - Java 8 开始支持,标识某注解可以在同一个声明上使用多次

  • 自定义注解

    • Java 可使用 @interface 自定义注解。

      public class customTest {
          /**
           * 有默认值的参数可以不赋值
           * 没有默认值的参数必须赋值
           * 若只有一个参数,设置其为 value 不设置默认值,也可以不赋值
           */
          @Myannotation(id = 1, name = "why", age = 10, school = "加里敦")
          public void test(){}
      }
      //自定义一个注解
      @Target(value = ElementType.METHOD)
      @Retention(value = RetentionPolicy.RUNTIME)
      @interface Myannotation{
          //注解参数:参数类型 参数名() 默认值 ×××;
          int    id()     default -1;
          String name()   default "";
          int    age()    default 0;
          String school() default "";
      }
      
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值