注解

优秀文章

博客园:
peida > Annotation的基本概念、自定义注解入门


说明

  • 自JDK1.5版本开始引入;
  • 只可包含成员变量;
  • 本身不会影响程序代码的执行;
  • 可以为程序元素(包、类、方法、属性、参数)提供特殊标记(注解),这些标记可嵌入信息(元数据),并且在程序运行时通过反射机制来获取这些信息;
  • 元数据(metadata),关于数据的数据;
  • 根据注解参数可分:标记注解(无参)、单值注解(单个参数)、完整注解(多个参数);
  • 根据注解用途可分:内置注解、元注解(注解的注解)、自定义注解;

系统内置标准注解

  1. @Override:用于修饰覆盖了父类方法的方法
    只可用于方法,若使用该注解的方法确实覆盖了父类的方法,则代码编译正常,若没有,则代码编译报错,常用于判断方法重写;
  2. @Deprecated:用于修饰已经过时的类成员
    使用该注解标记的类成员,编译器将不再鼓励使用这个类成员(编译时报警),并且该类成员通过继承被子类获得,同样具备该效果(延续性);
  3. @SuppressWarnnings:用于通知java编译器禁止特定的编译警告
    通常用于无法避免警告的程序元素,告诉编译器停止对该元素的警告,SuppressWarnnings注解具备一个String[]的成员,成员中可添加禁止的警告名(编译器会忽略无法识别的警告名);

自定义注解

  • 元注解(meta-annotation)
    • 说明:JDK1.5中定义了4个标准元注解,元注解与其他注解(内置标准注解除外)不同在于元注解是组成注解的重要组成部分,前者只用作描述(注解)后者,后者被前者描述(注解)才具备实际的注解功能;
      1. @Target(ElementType):用于描述注解的使用范围
      • 使用范围取值(ElementType):
        <1>FIELD:用于描述域
        <2>PACKAGE:用于描述包
        <3>TYPE:用于描述类、接口(包括注解类型) 或enum声明
        <5>METHOD:用于描述方法
        <6>PARAMETER:用于描述参数
        <7>LOCAL_VARIABLE:用于描述局部变量
      1. @Retention(RetentionPoicy):用于描述注解的有效范围
      • 有效范围取值(RetentionPoicy):
        <1>SOURCE:在源文件中有效
        <2>CLASS:在class文件有效
        <3>RUNTIME:在运行时有效
      1. @Documented:用于声明注解的可识别性
      • 说明:注解是不被javadoc等工具处理的,若注解使用@Documented描述,则可被javadoc等工具识别并文档化(生成API);
      1. @Inherited:用于描述注解的延续性,只作用于类
      • 说明:类上的注解是不会被继承的,若注解使用@Inherited描述,则该类注解可以被继承并还可继续被继承;
      • 注意:方法上的注解通常是可以被继承的,但是子类若重写了父类的方法,则此方法上的注解则无法继承得到;
  • 自定义
    • 接口:java.lang.annotation.Annotation
    • 声明:@interface
    • 格式:
      @meta-annotation
      public @interface 注解名 {
          public type name() default value;
      } 
      
    • 成员可为:所有基本数据类型、String、Class、enum、Annotation、及前面所有类型的数组;
    • 默认值:注解成员必须有确定的值,要么在定义时使用默认值,要么在使用时指定值,且非基本类型的成员值不能为null;
  • 实例
    //使用@Target元注解描述作用范围
    @Target(ElementType.TYPE)
    public @interface TestAnnotation{
        //int类型成员
        public int intType() default -1;
        //String类型成员
        public String strType() default "";
        //enum类型成员
        public enum Color{BULE,RED,GREEN};
    }
    
***
####最后
* 通过反射可获取注解信息;
* 注解的存在与否不影响代码的运行,但针对注解设计有效的处理流程可实现注解的价值;

你可能感兴趣的:(注解)