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

  本文主要概括注释的使用,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. C# DBHelper 第二版

    1. [代码][C#]代码     跳至 [1] [全屏预览] ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 ...

  2. 搭建consul 集群

    1.   准备工作 a)      启动三台虚拟机 s1:10.1.7.141 s2:10.1.7.139 s3:10.1.7.138 b)      每台机器上在 /home新建文件夹 mkdir ...

  3. 【Unity3d】火炬之光的X射线效果

    http://www.cnblogs.com/dosomething/archive/2012/04/03/2431149.html 人物和摄像机之间存在例如墙壁等的阻挡时  可以修改阻挡材质的alp ...

  4. angularjs向后台传递数据,与后端进行交互

    angularjs之数据交互 function loadLeftFirstNodes (){ $http.get(sourceUrl,{ params:{ mpId: mpId, visits: ce ...

  5. zabbix安装unixODBC配置完之后报错

    zabbix安装unixODBC配置完之后报错 libmysqlclient_16 not defined in file libmysqlclient_r.so.16 分析 我没有使用centos6 ...

  6. hdu1045 DFS

    #include<stdio.h> #include<string.h> int n; int maxx; ][]; ]={,-,,}; ]={,,,-}; ][][];//炮 ...

  7. 【bb平台刷课记】wireshark结合实例学抓包

    [bb平台刷课记]wireshark结合实例学抓包 背景:本校形势与政策课程课需要在网上观看视频的方式来修得学分,视频网页自带"播放器不可快进+离开窗口自动暂停+看完一集解锁下一集(即不能同 ...

  8. UIRefreshControl

    在iOS6中UITableViewController 已经集成了UIRefreshControl 控件.UIRefreshControl目前只能用于UITableViewController

  9. ember.js路由无效的解决思路

    进入今天的问题,就是route ember中就一个html,单页面程序(spa),所以页面的跳转,也可以叫做页面的路由,其实就是在这一个html中,不断的进行html的插入和删除了(个人理解) emb ...

  10. 【python】with的实现方法

    来源:http://www.ibm.com/developerworks/cn/opensource/os-cn-pythonwith/#icomments 重点: with方法适用于需要分配和清理资 ...