疯狂Java讲义笔记-第14章 Annotation(注解)

本文详细介绍了Java中的注解(Annotation),包括基本注解如@Override、@Deprecated、@SuppressWarnings及其作用,以及Java7的@SafeVarargs。此外,还讲解了JDK的元注解@Retention、@Target、@Documented和@Inherited的使用,并简述了如何自定义Annotation和提取其信息。
摘要由CSDN通过智能技术生成

第14章 Annotation(注解)

Annotation是代码里特殊标记,这些标记可以再编译、类加载、运行时被读取,并执行响应的处理。Annotation能被用来为程序元素(类、方法、成员变量等)设置元数据。

14.1 基本Annotation

4个基本Annotation:

  • @Override
  • @Deprecated
  • @SuppressWarnings
  • @SafeVarargs
14.1.1 限定重写父类方法:@Override

@Override: 注解的方法必须为父类的方法,只能作用于方法,不能作用于其他程序元素。

14.1.2 标识已过时:@Deprecated

@Deprecated: 用于表示某个程序元素(类、方法等)已过时,当其他程序使用已过时的类、方法时,编译器将发出警告。

14.1.3 抑制编译器警告:@SuppressWarnings

@SuppressWarnings: 指示被修饰的元素取消显示指定的编译器警告。如:@SuppressWarnings(value=“unchecked”)

14.1.4 Java7的“堆污染”警告与@SafeVarargs

用来消除“堆污染”的警告(详情挖坑代填)

14.2 JDK的元Annotation

java.lang.annotation包下有4个Meta Annotation(元Annotation),这4个元Annotation都用于修饰其他的Annotation定义。

14.2.1 使用@Rentention

标明注解的保留范围,该注解有个value的值,该值有三个RententionPolicy类型的可选选项:

  • RententionPolicy.CLASS: 编译器将把Annotation记录在class文件中。当运行Java程序时,JVM不再保留Annotation。这是默认值。
  • RententionPolicy.RUNTIME: 编译器将把Annotation记录在class文件中。当运行Java程序时,JVM也会保留Annotation,程序可以通过反射获取Annotation信息。
  • RententionPolicy.SOURCE: Annotation只保留在源代码中,编译器直接丢掉这种Annotation。

如果需要通过反射获取注解信息,就需要使用value的值为RententionPolicy.RUNTIME的@Rentention。使用方法如:

// 定义下面的Teatable Annotation保留到运行时
@Rentention(value = RententionPolicy.RUNTIME)
public @interface Testable{}

若Annotation的成员变量名为value时,程序中可以直接在Annotation后的括号里指定该成员变量的值,无须使用name=value的形式。

14.2.2 使用@Rentention

@Target 也只能修饰一个Annotation定义,它用于指定被修饰Annotation能用于修饰哪些程序单元。@Target包含一个名为value的成员变量,该成员变量的值为如下几个:

  • ElementType.ANNOTATION_TYPE: 指定该策略的Annotation只能为修饰
  • ElementType.CONSTRUCTOR: 只能修饰构造器
  • ElementType.FIELD: 指定该策略的Annotation只能修饰成员变量
  • ElementType.LOCAL_VARIABLE: 只能修饰局部变量
  • ElementType.METHOD: 只能修饰方法定义
  • ElementType.PACKAGE: 只能修饰包定义
  • ElementType.PARAMETER: 可以修饰参数
  • ElementType.TYPE: 可以修饰类、接口(包括注解类型)或枚举定义。

使用方法如下:

@Target(ElementType.FIELD)
public @interface Testable{}

14.2.3 使用@Documented

14.2.3 使用@Inherited

如果@Testable被@Inherited修饰表示@Testable修饰的类的子类也被该注解修饰。

14.3 自定义Annotation

14.3.1 定义Annotation

定义注解采用@interface来定义。

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.PARAMETER)
public @interface MyTest {
  //注解中定义成员变量以方法的形式来定义
  String name();
  int age();
}

如上代码定义了一个运行时注解,注解作用元素为PARAMETER,有两个成员变量:name和age。

14.3.2 提取Annotation信息

利用反射获取程序元素的注解信息。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值