java语言中的注释简介_Java语言(7)-Java中的注解

参考:java技术手册

java有两种特殊形式的类型,在java类型系统中扮演着特定的角色。这两种类型是枚举类 型(enumerated type)和注解类型(annotation type)。

本文介绍注解。

一、什么是注解

注解是一种特殊的接口。如名称所示,其作用是注解 Java 程序的某个部分。

例如 @Override 注解。在前面的一些示例中你可能见到过这个注解,想知道它有什么作用。

简单来说,什么作用也没有。这个答案或许会让你感到诧异。

说得稍微详细一点儿,注解没有直接作用,@Override 只是为注解的方法提供额外的信息,注明这个方法覆盖了超类中的方法。

注解能为编译器和集成开发环境(Integrated Development Environment,IDE)提供有用的提示。

如果开发者把方法的名称拼写错了,而这个方法本来是要覆盖超类的方法,那么,在这个名称拼错的方法上使用 @Override 注解,可以提醒编译器什么地方出错了。

注解不能改变程序的语义,只能提供可选的元信息。严格说来,这意味着注解不能影响程序的执行,只能为编译器和其他预执行阶段提供信息。

Java 平 台 在 java.lang 中 定 义 了 为 数 不 多 的 基 本 注 解。 一 开 始 只 支 持:

@Override:注明方法是覆盖的

@Deprecated :注明方法废弃了

@SuppressWarnings:静默编译器生成的警告。

后来,Java 7 增加了 :

@SafeVarargs(为变长参数方法提供增强的警告静默功能)

Java 8 增 加了

@FunctionalInterface。表示接口可以用作 lambda 表达式的目标。

和普通的接口相比,注解有些特殊的特性:

• 都(隐式)扩展 java.lang.annotation.Annotation 接口;

• 不能泛型化;

• 不能扩展其他接口;

• 只能定义没有参数的方法;

• 不能定义会抛出异常的方法;

• 方法的返回类型有限制;

• 方法可以有一个默认返回值。

二、自定义注解

开发者可以使用 @interface 关键字自定义新的注解类型,与定义类和接口的方式差不多。

自定义注解的关键是使用“元注解”。元注解是特殊的注解,用来注解新(自定义)注解类型的定义。

元注解在 java.lang.annotation 包中定义。开发者使用元注解指定新的注解类型能在哪里使用,以及编译器和运行时如何处理注解。

创建新的注解类型时,必须使用两个基本的元注解@Target 和 @Retention。这两个注解接受的值都在枚举中定义。

@Target:元注解指明自定义的新注解能在 Java 源码的什么地方使用。可用的值在枚举 ElementType 中 定 义, 包 括:TYPE、FIELD、METHOD、PARAMETER、CONSTRUCTOR、LOCAL_ VARIABLE、ANNOTATION_TYPE、PACKAGE、TYPE_PARAMETER 和 TYPE_USE。

@Retention: 指明 javac 和 Java 运行时如何处理自定义的注解类型。可使用的值有三个,在枚举 RetentionPolicy 中定义。

• SOURCE 使用这个保留原则的注解,编译时会被 javac 丢弃。

• CLASS 表示注解会出现在类文件中,但运行时 JVM 无法访问。这个值很少使用,但有时会在 JVM 字节码的离线分析工具中见到。

• RUNTIME 表示用户的代码在运行时(使用反射)能访问这个注解。

示例:如下这是个简单的注解,名为 @Nickname。开发者使用这个注解为方法指定一个昵称,运行时使用反射可以找到这个方法。

@Target(ElementType.METHOD)

@Retention(RetentionPolicy.RUNTIME)

public @interface Nickname {

String[] value() default {};

}

定义注解——先指明注解能出现在哪里,然后是保留原则,最后是注解的名称。因为我们要给一个方法起昵称,所以还要在这个注解上定义一个方法。

除了两个基本的元注解之外,还有两个元注解:@Inherited 和 @Documented。实际使用中很少见到这两个注解,它们的详细说明参见 Java 平台的文档。

三、类型注解

Java 8 为枚举 ElementType 添加了两个新值:TYPE_PARAMETER 和 TYPE_USE。添加这两个值 后,注解能在以前不能出现的地方使用了,例如使用类型的所有地方。现在,开发者可以编写如下的代码:

@NotNull

String safeString = getMyString();

@NotNull 传达的额外类型信息可在特殊的类型检查程序中使用,用于检测问题(对这个例 子来说,可能抛出 NullPointerException 异常),还能执行额外的静态分析。Java 8 基本版自带了一些插入式类型检查程序,还提供了一个框架,开发者和库的作者可以使用这个框 架自己编写类型检查程序。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值