注解(Annotation)

注解(Annotation)

  • Annotation是从JDK1.5开始引入的新技术

  • Annotation的作用

    • 不是程序本身,可以对程序作出解释
    • 可以被其他程序(如:编译器)读取
  • Annotation的格式

    • 注解是以“@注解名”在代码中存在的,还可以添加一些参数值
  • Annotation在哪里使用?

    • 可以附在package,class,method,field,type,parameter,constructor,local_variable等上面,相当于给他们添加了额外的辅助信息,我们可以通过反射机制编程实现对这些元数据的访问

内置注解

  • @Deprecated

    意思是说此方法已过时,是因为有新的API的类替代了此方法。这个被划去的方法仍然是可以正常使用的。


  @Documented
  @Retention(RetentionPolicy.RUNTIME)
  @Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})
  public @interface Deprecated {
  }
  • 2.@Override

    方法重写


  @Target(ElementType.METHOD)
  @Retention(RetentionPolicy.SOURCE)
  public @interface Override {
  }
  • @SuppressWarnings

    通知java编译器忽略特定的编译警告。

    • 抑制单类型的警告:@SuppressWarnings(“unused”);
    • 抑制多类型的警告:@SuppressWarnings(“unused”,“unchecked”);
    • 抑制所有类型的警告:@SuppressWarnings(“all”)

  @Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
  @Retention(RetentionPolicy.SOURCE)
  public @interface SuppressWarnings {
      String[] value();
  }
  • @FunctionalInterface

    • 主要用于编译级错误检查,当写的接口不符合函数式接口定义的时候,编译器会报错。
    • 函数式接口的特点:
      • 只有一个抽象方法
      • 允许定义默认的方法,因为默认方法不是抽象的(default修饰的)
      • 允许定义静态方法,因为静态方法不是抽象
      • 函数式接口里是可以包含Object里的public方法,这些方法对于函数式接口来说,不被当成是抽象方法(虽然它们是抽象方法);因为任何一个函数式接口的实现,默认都继承了Object类,包含了来自java.lang.Object里对这些抽象方法的实现

  @Documented
  @Retention(RetentionPolicy.RUNTIME)
  @Target(ElementType.TYPE)
  public @interface FunctionalInterface {}
  • @SafeVarargs

    • 在声明具有模糊类型(比如:泛型)的可变参数的构造函数或方法时,Java编译器会报unchecked警告。鉴于这些情况,如果程序员断定声明的构造函数和方法的主体不会对其varargs参数执行潜在的不安全的操作,可使用@SafeVarargs进行标记,这样的话,Java编译器就不会报unchecked警告。

    • 由Java源代码声明我们了解到:@SafeVarargs注解,只能用于标记构造函数和方法,由于保留策略声明为RUNTIME,所以此注解可以在运行时生效。

    • 使用的时候要注意:@SafeVarargs注解,对于非static或非final声明的方法,不适用,会编译不通过。


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

元注解

  • @Target

    描述注解的使用范围(即:被修饰的注解可以用在什么地方) 。


  public enum ElementType {
      TYPE, // 类、接口、枚举类
      FIELD, // 成员变量(包括:枚举常量)
      METHOD, // 成员方法
      PARAMETER, // 方法参数
      CONSTRUCTOR, // 构造方法
      LOCAL_VARIABLE, // 局部变量
      ANNOTATION_TYPE, // 注解类
      PACKAGE, // 可用于修饰:包
      TYPE_PARAMETER, // 类型参数,JDK 1.8 新增
      TYPE_USE // 使用类型的任何地方,JDK 1.8 新增
  }
  • @Retention

    描述注解保留的时间范围(即:被描述的注解在它所修饰的类中可以被保留到何时)


  public enum RetentionPolicy {
      SOURCE,    // 源文件保留
      CLASS,       // 编译期保留,默认值
      RUNTIME   // 运行期保留,可通过反射去获取注解信息
  }
  • @Documented

    描述在使用 javadoc 工具为类生成帮助文档时是否要保留其注解信息。

    查看 index.html 帮助文档,可以发现在类和方法上都保留了 MyDocumentedtAnnotation 注解信息。

  • @Inherited

    使被它修饰的注解具有继承性(如果某个类使用了被@Inherited修饰的注解,则其子类将自动具有该注解)。

自定义注解

@Target(value={ElementType.METHOD,ElementType.TYPE})
@Retention(value=RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface MyAnnotation{
	String value();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值