【Java】Java注解

Java注解

从 JDK1.5 开始,Java 引入了注解机制。

功能

注解使得 Java 源代码中不但可以包含功能性的实现代码,还可以添加元数据1

通过使用注解,程序开发人员可以在不改变程序原有逻辑的情况下,在源代码中加入一些补充信息。代码分析工具、开发工具和部署工具可以通过这些补充信息进行验证和部署。

注解的形式

  • 不带参数的注解: @Annotation,例如 @Override
  • 带一个参数的注解: @Annotation(参数),例如 @SuppressWarnings(value="unused")
  • 带多个参数的注解: @Annotiation({参数 1, 参数 2, 参数 3...}),例如 @MyTag(name= "jhon",age=20)

Java的三个内建注解

java.lang 包中,预定义了三个注解。

@Override :限定重写父类方法

@Override 注解只能用来修饰方法,不能用来修饰其他元素。

在子类重写父类的方法前加上@Override,表示这个方法是覆盖了父类的方法。如果该方法不是覆盖了父类的方法,则代码编译不能通过,提示被 @Override 注解的方法必须在父类中存在同样的方法,程序才能编译通过。

@Deprecated:标记已过时

如果某个类成员的提示中出现了 @Deprecated,就表示这个类成员已经过时,在未来的 JDK 版本中可能被删除,当前已不建议使用。之所以现在还保留,是因为给那些已经使用了这些类成员的程序一个过渡期。

@SuppressWarnings:抑制编译器警告

@SuppressWarnings 注解和前面两个注解的不同之处在于,这个注解带一个参数。

注解 @SuppressWarnings(value = "unchecked") 的含义为抑制不检查的警告。当然还可以同时抑制其他警告,例如 @SuppressWarnings(value = {"unchecked", "unused"}) 就是同时抑制了不检查和未被使用的警告。

下面列举了 @SuppressWarnings 注解相关属性值的含义:

  • deprecation:使用了过时的程序元素。
  • unchecked:执行了未检查的转换。
  • unused:有程序元素未被使用。
  • fallthrough:switch 程序块直接通往下一种情况而没有 break。
  • path:在类路径中有不存在的路径。
  • serial:在可序列化的类上缺少 serialVersionUID 定义。
  • finally:任何 finally 子句都不能正常完成。
  • all:所有情况。

元注解

Java 为注解单独提供了四种元注解

@Target

@Target 注解的目的是用于指定被修饰的注解能用于修饰哪些程序元素(属性、方法、类或者接口等)。

如果注解定义中不存在 @Target 元注解,则此注解可以用在任一程序元素上。

若自定义的注解用@Target({ElementType.FIELD})进行注解,则限制此注解只能使用在属性上。此时如果将此注解使用在方法上, 编译器会报出 “注释类型不适用于该类型的声明” 的错误。

@Target 注解有唯一的 value 作为成员变量

  • value可以为以下值
    • ElementType.ANNOTATION_TYPE:注解类型声明
    • ElementType.CONSTRUCTOR:构造方法声明
    • ElementType.FIELD:字段声明(包括枚举常量)
    • ElementType.LOCAL_VARIABLE:局部变量声明
    • ElementType.METHOD:方法声明
    • ElementType.PACKAGE:包声明
    • ElementType.PARAMETER:参数声明
    • ElementType.TYPE:类、接口(包括注解类型)或枚举声明
@Retention

@Retention 元注解用于指定被修饰的注解可以保留多长时间。

@Retention 包含一个 RetentionPolicy 类型的 value 属性,使用此注解时必须为该 value 属性指定值。

如果注解定义中不存在 @Retention 元注解,则保留策略默认为 RetentionPolicy.CLASS

  • @Retention 注解的属性 value 允许的值及含义如下:
    • RetentionPolicy.CLASS:编译器将把注解记录在 class 文件中,当运行 Java 程序时,虚拟机不再保留注解
    • RetentionPolicy.RUNTIME:编译器将把注解记录在 class 文件中,当运行 Java 程序时,虚拟机保留注解,程序可以通过反射获取该注解
    • RetentionPolicy.SOURCE:编译器将直接丢弃被修饰的注解
@Documented

JDK提供了文档工具javadoc,用于将源码转换成一个说明文档。

如果想在文档中保留注解,就需要用@Documented为文档注解,如果定义注解时使用了@Documented修饰,则所有使用该注解的程序元素的API文档中都将包含该注解说明。

@Documented注解类型中没有成员变量

@Inherited

默认情况下,父类的注解不被子类继承,如果想要继承父类注解,就需要使用@Inherited元注解。

自定义注解

定义注解的语法形式和接口差不多,只是在 interface 前面多了一个@符号:

导包:import java.lang.annotation.*;

public @interface MyAnnotation1{}

注解可以理解为和接口一样,是程序的一个基本组成部分。既然可以对类、接口、方法和属性等进行注解,那么当然也可以对注解进行注解


  1. 指描述数据的数据,如描述图片的创建日期、图片大小等信息就是元数据 ↩︎

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值