注释是一种形式的元数据,提供了非程序自身的数据,注释对于被注释的代码没有直接的影响。

  本文主要概括注释的使用,java平台(SE)预定义的注释,类型注释是如跟可插入类型系统连用达到更强的类型检查的,以及如何实现重复注释。

  注释有许多用途,包括:

  • 为编译器提供信息--编译器可以利用注释检查错误或者抑制警告信息
  • 编译时或者部署时处理--软件工具可以处理注释并生成代码,XML文件等等
  • 运行时处理--有些注释在运行时可以被检测到

注释格式

  注释最简单的形式如下:

@Entity

  @符号提示编译器接下来的词是一个注释,示例中注释为Entity,注释中可以包含元素,元素可以是命名的也可以是未命名的,如果注释中仅有一个元素,则元素名称可以省略,如果注释中不含元素,则圆括号可以省略,可以在一个声明中使用多个注释,java8中可以允许使用多个相同名称的注释,又叫重复注释:

//注释中包含元素
@Author(
name = "Benjamin Franklin",
date = "3/27/2003"
)
class MyClass() {
//注释中只有一个元素,则名称可省略
@SuppressWarnings("unchecked")
void myMethod() { ... }
//...
}

注释使用的位置

  注释可以应用于声明中,包括类,字段,方法和其他变成元素的声明。一般情况下,每个注释占用一行。

  java8 以后,注释也可以在类型使用的使用的时候应用,如下所示:

//类实例床架表达式
new @Interned MyObject();
//类型转化
myString = (@NonNull String) str;
//实现短语
class UnmodifiableList<T> implements
@Readonly List<@Readonly T> { ... }
//抛出异常声明
void monitorTemperature() throws
@Critical TemperatureException { ... }

  所有注释的形式叫做类型注释。

声明注释

  注释的声明示例:

@interface ClassPreamble {
String author();
String date();
 int currentRevision() default 1;
}

  注释的定义类似于接口,只不过interface关键词前有@符号,实际上注释类型是一种形式接口,注释的主体定义包含了注释的元素声明,元素可以有默认值,添加默认值的方法就是在元素声明后跟上default关键词以及默认值,如上例子所示。

预定义注释类型

  java se API中预定义了多个注释类型,其中有一些是被java编译器用的,有一些是应用与其他注释的。

java语言使用的注释

  在java.lang包中预定义的注释类型有@Deprecated,@Override和SupressWarning。

  @Deprecated提示所注释的元素已经弃用,不应该再使用。当一个被@Deprecated注释所注释的方法,类或者字段被使用时,编译器将产生警告信息。当决定要弃用一个元素时,也应该在javadoc中体现,利用javadoc的@deprecated标签,如下例所示,javadoc标签以小写字母开头:

   // Javadoc此处写javadoc注释
/**
* @deprecated
* explanation of why it was deprecated
*/
@Deprecated
static void deprecatedMethod() { }
}

  @Override注释用于通知编译器该注释所注释的方法将覆写父类中的方法,当然,覆写方法不需要用@Override注释,@Override注释的使用能减少错误,如方法名称拼写错误,如果没有成功覆写方法,则编译器将产生错误。

  @SuppressWarnings注释通知编译器抑制指定的错误信息的产生,每条错误信息都属于一个类型,java语言说明书中列出了两种错误信息:deprecation和unchecked。

  @SafeVarargs(java7及以后)注释应用于方法或者构造器上,使用注释时,含有可变变量的方法或者构造器将不会因为对可变变量的可能不安全的操作产生unchecked警告信息。

  @FunctionalInterface注释在java8中引入,使用该注释表明被注释的接口为功能接口。 

其他注释使用的注释

  被用于其他注释的注释叫做元注释(meta-annotations),java.lang.annotation中有多个元注释。

  @Retention注释指定如何存储标记的注释:

  • RetentionPolicy.SOURCE – 标记的注释仅仅保留在源代码层,被编译器忽略
  • RetentionPolicy.CLASS – 标记的注释在编译时被保留,但是会被java虚拟机忽略
  • RetentionPolicy.RUNTIME – 标记的注释在java虚拟机中保留,但是在运行时被忽略

  @Documented注释提示指定的注释在使用时也应该使用javadoc工具撰写文档。

  @Target注释用来限制标记的注释所使用的对象,该注释指定以下元素类型中的一个作为其值:

  • ElementType.ANNOTATION_TYPE 能应用于一个注释
  • ElementType.CONSTRUCTOR 能应用于一个构造器
  • ElementType.FIELD 能应用与一个注释或者属性
  • ElementType.LOCAL_VARIABLE 能应用于一个局部变量
  • ElementType.METHOD 能应用于方法层的注释
  • ElementType.PACKAGE 能应用于包声明
  • ElementType.PARAMETER 能应用于一个方法的参数
  • ElementType.TYPE 能应用于一个类

  @Inherited注释提示标记的注释类型可以从超类继承(默认不能继承),当用户未检索到该类型的注释时,将在其父类中检索该注释,该注释仅能在类的声明中使用。

  @Repeatable注释是从java8开始引入的,提示标记的类型可以对同一个元素使用多次。

类型注释和可插入类型系统

  java8以前,注释只能用在声明当中,java8以后,注释可以应用于任何类使用的地方,比如类实例的创建表达式(new),转化(cast),实现子句以及抛出子句(以上注释的使用位置已举例)。

  类型注释的常见可用于支持改进的类型检查的java编程方式的分析。java8 SE自身并没有提供类型检查的框架,但你可以编写或者是下载一个由一个或多个用于结合java编译器的模块而实现的类型检查框架,如华盛顿大学编写的检查框架Checker Framework

检索注释

  Reflection API中有多个方法可以用来检索注释,返回单个注释的方法,如AnnotatedElement.getAnnotationByType(Class<T>),其行为没有发生改变,java8以后,由于可以重复使用一个类型的注释,由于兼容的原因,重复的注释是存储在一个注释容器内的,由java编译器自动生成,因此当有重复注释时,可先获得多个注释的注释容器,这样传统返回单个注释的方法照样可以使用。java8也引入了一个可以一次返回多个注释的方法,如AnnotatedElement.getAnnotations(Class<T>)。

  以上的AnnotatedElement是一个接口,位于java.lang.reflect内,因此所有实现该接口的类都可以使用该接口声明的方法来检索注释,如Class<T> 就实现了该接口,如果有一个类OneType,要检索该类是否使用了@Deprecated注释,可以用如下语句:

//如果OneType声明时使用java SE中的@Deprecated注释,则返回一个注释对象,否则返回null
Deprecated de=OneType.class.getAnnotation(Deprecated.class);

java基础-注释的更多相关文章

  1. Java基础——注释规范

    一.注释格式分类: 1.单行(single-line)注释://…… 2.块(block)注释:/*……*/ 3.文档注释:/**……*/ javadoc有如下: 二.加注释的场景: 1. 基本注释( ...

  2. java基础———注释

    注释是写给读者看的,并不会被执行! 单行注释 以 //开头 例如://注释内容              可以注释一行文本 多行注释 以/*开头     以 */结束 例如:/*注释内容*/      ...

  3. Java基础之理解Annotation(与@有关,即是注释)

    Java基础之理解Annotation 一.概念 Annontation是Java5开始引入的新特征.中文名称一般叫注解.它提供了一种安全的类似注释的机制,用来将任何的信息或元数据(metadata) ...

  4. java基础基础总结----- 关键字、标识符、注释、常量和变量、运算符、语句、函数、数组(三)

    Java语言基础组成:关键字.标识符.注释.常量和变量.运算符.语句.函数.数组 一.标识符 标识符是在程序中自定义的一些名称,由大小写字母[a-zA-Z],数字[0-9],下划线[ _ ],特殊字符 ...

  5. Java基础(Java概述、环境变量、注释、关键字、标识符、常量)

    第1天 Java基础语法 今日内容介绍 u Java开发环境搭建 u HelloWorld案例 u 注释.关键字.标识符 u 数据(数据类型.常量) 第1章 Java开发环境搭建 1.1 Java概述 ...

  6. Java基础语法(6)-注释

    title: Java基础语法(6)-注释 blog: CSDN data: Java学习路线及视频 用于注解说明解释程序的文字就是注释. 提高了代码的阅读性:调试程序的重要方法. 注释是一个程序员必 ...

  7. [java基础]文档注释

    转载自:http://blog.163.com/hui_san/blog/static/5710286720104191100389/ 前言 Java 的语法与 C++ 及为相似,那么,你知道 Jav ...

  8. java基础 (记事本编写hello world,path,classpath,java的注释符)

    一:java的基本信息 jre 是指java运行环境,jdk 是指 java 开发工具集(并且里面是自带有jre运行环境的) jvm是指java的虚拟机 java的源代码的后缀名是 .java (例如 ...

  9. Java基础知识(壹)

    写在前面的话 这篇博客,是很早之前自己的学习Java基础知识的,所记录的内容,仅仅是当时学习的一个总结随笔.现在分享出来,希望能帮助大家,如有不足的,希望大家支出. 后续会继续分享基础知识手记.希望能 ...

随机推荐

  1. mysql 目录的了解以及Linux

    Linux   目录                描述 /                                                                       ...

  2. Android Notification通知详解

    根据activity的生命周期,在activity不显示时,会执行onStop函数(比如按下home键),所以你在onStop函数(按退出键除外)里面把notification放在通知栏里,再此显示时 ...

  3. 元素堆叠问题、z-index、position

    多次在项目中遇到html页面元素的非期待重叠错误,多数还是position定位情况下z-index的问题.其实每次解决类似问题思路大致都是一样的,说到底还是对z-index的理解比较模糊,可以解决问题 ...

  4. 报错注入分析之Extractvalue分析

    Extractvalue(这单词略长,拆分记忆法extract:提取物 value:值) 上一篇说的是updatexml.updatexml是修改的.而evtractvalue是查询的. 用法与upd ...

  5. php 路径

    //魔术变量,获取当前文件的绝对路径 echo "__FILE__: ========> ".__FILE__; echo '<br/>'; //魔术变量,获取当 ...

  6. MQTT(三)-----连接与心跳

    MQTT协议笔记之连接和心跳 - 推酷 http://www.tuicool.com/articles/AFvmee 互联网推送服务原理:长连接+心跳机制(MQTT协议) - clh604的专栏 - ...

  7. 我的bootstrapTable的应用

    $(function () { //$('#table').attr("data-url", "/conference/" + location.href.sp ...

  8. Quartz定时任务简单实例

    文章纲要: 初步搭建一个由Quartz为引擎集群的定时任务模块,功能为每隔30秒打印一条信息(Hello World!!!) 一.环境 Spring MVC Mevan Quartz 2.2.1 二. ...

  9. 关于chart.js 设置canvas的宽度为父级元素的宽度的百分百 以及 X轴上面刻度数据太多如何处理

    今天在做一个数据统计的界面的时候,需要做折线统计图,在网上找了一圈发现数据统计的插件还是不少的,本着轻量级的的原则选择了Chart.js,后来在做的过程中便遇到两个问题,以此记录下来,和刚刚接触前端的 ...

  10. mssqlserver 数据库一直提示“正在还原”

    今天访问服务器,突然发现不知道数据库被谁给还原了,而且一直处于还原状态无法结束. 通过查询说是恢复进程被挂起了,最终通过命令: RESTORE database   dbname with recov ...