java中注解的解析_全面解析Java中的注解与注释

注解一、什么是 Annotation? (注解 or 注释)Annotation, 准确的翻译应该是 -- 注解。 和注释的作用完全不一样。

Annotation 是JDK5.0及以后版本引入的一个特性。 与类、接口、枚举是在同一个层次,可以成为java 的一个类型。

语法是以@ 开头

简单来说,

注释是程序员对源代码的类,方法,属性等做的一些记忆或提示性描述(比如这个方法是做什么用的),是给人来看的。

注解则是Java 编译器可以理解的部分,是给编译器看的。

举个简单的例子来看一下注解的使用和作用。

@Override 是比较常见的Java 内置注解,它的作用就是在编译代码的时候检查子类中定义的方法是否正确。

package annotation;

public abstract class Animal {

public abstract void eat();

}

package annotation;

public class Cat extends Animal{

@Override

public void eat(String food) {

}

}

这里在子类Cat中 eat 方法被注解为覆写父类的方法, 但是却比父类方法多出一个参数。

如果是在Eclipse 在编辑的话, 直接就会有红色叉叉提示。(代码编译会通不过)。

如果去掉@Override的注解的话, 编译没问题, 但是Cat 中eat方法就是这个类的一个新的方法了,而不是从父类继承的了。

二、常见的Java 内置注解包含@Override , 还有哪些常见的Java内置注解?

1. @Deprecated

注解为不建议使用,可以用在 方法和类上。

基本上这种方法和类都是因为升级或性能上面的一些原因废弃不建议使用,但是为了兼容或其他原因,还必须保留。

所以就打上这个注解。

在Java 本身的API中就有很多这样的例子, 方法打上了这个注解,进到Source code 会看到替代的新的方法是哪个。

在eclipse 中编写code时,添加此注解的方法在声明和调用的地方都会加上删除线。

2.@Override

3.@SuppressWarnings

忽略警告。

如果你的code在转型或其他的部分有一些警告的话,但是你又想忽略这些警告,就可以使用这个注解了。

1)deprecation 使用了不赞成使用的类或方法时的警告

2)unchecked 执行了未检查的转换时警告

3)fallthrough 当使用switch操作时case后未加入break操作,而导致程序继续执行其他case语句时出现的警告

4)path 当设置一个错误的类路径、源文件路径时出现的警告

5)serial 当在可序列化的类上缺少serialVersionUID定义时的警告

6)fianally 任何finally子句不能正常完成时警告

7)all 关于以上所有情况的警告

三、自定义注解除了Java本身提供的内置注解, Java 还提供了定制自定义注解的功能。

定义的方式就是使用注解定义注解, 用来定义注解的注解称为元注解。

主要的元注解有以下四个:@Target ;@Retention;@Documented;@Inherited

1. @Target 表示该注解用于什么地方,使用在类上,方法上,或是属性等

可能的 ElemenetType 参数包括:

ElemenetType.CONSTRUCTOR 构造器声明

ElemenetType.FIELD 域声明(包括 enum 实例)

ElemenetType.LOCAL_VARIABLE 局部变量声明

ElemenetType.METHOD 方法声明

ElemenetType.PACKAGE 包声明

ElemenetType.PARAMETER 参数声明

ElemenetType.TYPE 类,接口(包括注解类型)或enum声明

2. @Retention 表示在什么级别保存该注解信息

可选的 RetentionPolicy 参数包括:

RetentionPolicy.SOURCE 注解将被编译器丢弃

RetentionPolicy.CLASS 注解在class文件中可用,但会被VM丢弃

RetentionPolicy.RUNTIME VM将在运行期也保留注释,因此可以通过反射机制读取注解的信息。

3. @Documented ,产生doc时,是否包含此注解

将此注解包含在 javadoc 中

4.  @Inherited

允许子类继承父类中的注解

看一些简单定义的例子:

package annotation;

import java.lang.annotation.Documented;

import java.lang.annotation.ElementType;

import java.lang.annotation.Inherited;

import java.lang.annotation.Retention;

import java.lang.annotation.RetentionPolicy;

import java.lang.annotation.Target;

@Target(ElementType.METHOD)

public @interface MyAnnotation {

String value();

}

@Retention(RetentionPolicy.SOURCE)

@interface MyAnnotation1 { }

@Retention(RetentionPolicy.CLASS)

@interface MyAnnotation2 {}

@Retention(RetentionPolicy.RUNTIME)

@interface MyAnnotation3 {}

@Documented

@interface MyAnnotation4 {}

@Inherited

@interface MyAnnotation5 { }

四、使用例子:

package annotation;

import java.lang.annotation.Annotation;

@MyAnnotation3

public class TestAnnotation {

public static void main(String[] args) {

// TODO Auto-generated method stub

Annotation annotation = TestAnnotation.class.getAnnotation(MyAnnotation3.class);

System.out.println(annotation.toString());

}

}

打印出结果: @annotation.MyAnnotation3()

以上例子如果替换使用 MyAnnotation1 和 MyAnnotation2 的话, 则取到的annotation的值为空,这就是RetentionPolicy 不同的差别。

五、Annotation的作用

介绍到此,可以总结一下Annotation的作用了。

基础的大致可以分为三类:

1. 编写文档

2. 代码分析

3. 编译检查

但是,开源框架对其赋予了更多的作用

比如:

Hibernate,注解配置,

@Column("aa")

private String xx;

这个类似于XML配置,简化程序中的配置

相对与把一部分元数据从XML文件移到了代码本身之中,在一个地方管理和维护。

内部如何实现的? -- java 反射机制,类似与以上例子。

注释虽然注解、注释只相差一个字,但是用法就差异很大。

还是那句话, 注解给编译器看, 注释是给人看的。

基于此的话, 对于一个方法来说:

1. 把这个方法的作用, 输入,输出描述清楚就可以了,更多的可以加上一些作者呀,版本呀这样一些信息

2. 注释编排的美观一些

做到这两点应该就可以了。 举个例子:

/*******************************************************************************

* NAME: usage

* DESCRIPTION: XXX

* ARGUMENTS: N/A

* RETURN:

* AUTHOR: oscar999

* VERSION: V0.1

*******************************************************************************/

看上去这是一个不错的注释^^.

但是对于Java 语言来说, 注释被赋予了更多的功能。 就是你可以使用javadoc 这个功能把代码中的注释导出到  html 的文件中。

如果你的代码是共用性很高的代码的话, 这份文档就是一份API的参考文档, 类似Java API.

所以, 要产生出这样的文档,就要遵循java 定义的一些注释规范, 才能产生出规范的文档出来。

一、Java 类方法的标准注释还是从类的方法的注释说起。

/**

* Read a line of text. A line is considered to be terminated by any one

* of a line feed ('\n'), a carriage return ('\r'), or a carriage return

* followed immediately by a linefeed.

*

* @param ignoreLF1 If true, the next '\n' will be skipped

   * @param   ignoreLF2 If true, the next '\n' will be skipped
* * @return A String containing the contents of the line, not including * any line-termination characters, or null if the end of the * stream has been reached * * @see java.io.LineNumberReader#readLine() * * @exception IOException If an I/O error occurs */

(不去关注以上注释的意义,只关注其定义的样式)

1. 首先看最上面的 “Read a line of text.  A line .. ” 这一段是对这个方法的一些描述。

第一个句号前面的部分, 也就是 “Read a line of text.” 会出现在 “方法摘要” 中

2. @param 定义的是方法的输入参数,(可以添加多个)出现在“ 方法详细信息” 中。(参数和参数描述之间使用空格隔开, 在产生的文档中转成了  -)

3. @return  返回值的描述

4. @see  参考的描述

5. @exception 异常抛出的描述

美观考虑, 不同类的标签可以换一行显示, 比如 @param 和 @return 直接空一行。

二、Java 类标准注释类的注释和方法注释的格式基本相同。 区别的地方:

1. 放置的位置不同。 类的注释放在类定义的上面, 方法的注释放在方法定义的上面。

2. 类的注释比较会使用   @version  @author  @since 这样的标签。

看模板

/** will buffer the input from the specified file. Without buffering, each

* invocation of read() or readLine() could cause bytes to be read from the

* file, converted into characters, and then returned, which can be very

* inefficient.

*

*

* Test Description

*

*

Programs that use DataInputStreams for textual input can be localized by

* replacing each DataInputStream with an appropriate BufferedReader.

*

* @see FileReader

* @see InputStreamReader

*

* @version 0.1, 11/20/13

* @author oscar999

* @since JDK1.5

*/

doc 中显示的效果是:

同样, 描述的第一句出现在“类概要”中。

类的详细信息显示如下:

值得注意的是 description 中

的使用。 如果没有加

, 在java code 中不管是否有换行,产生的doc 中都不换行。 加上

的话, doc 中出现换行。

三、补充补充一下, 产生javadoc的方法:

1. 命名行方式:  javadoc  + 参数

2. 使用Eclipse IDE 导出

如果在Eclipse IDE 中, 在源文件或是项目上右键单击 , 选 Export  --->

Java --> Javadoc 就可以产生了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/303480.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安装配置Mysql主从

环境: 主从服务器上的MySQL数据库版本同为5.1.34 主机IP:192.168.0.1 从机IP:192.168.0.2 一. MySQL主服务器配置 1.编辑配置文件/etc/my.cnf # 确保有如下行 server-id 1 log-binmysql-bin binlog-do-dbmysql #需要备份的数据库名&#xf…

玩的时候好好玩,学的时候好好学。不做半吊子

要用大块的时间学习,玩的时间也不能短。比如:一周七天六天认认真真学习,不要某天下午一犹豫懒惰就不去实验室了,没有任何目的度过了无聊的下午。同时又没有玩的计划所以,玩的也不开心。 现在要做到的就是正常的计划不要…

java实现思维导图_Java并发(思维导图)

1,线程状态转换无限期等待:限期等待:线程生命流程:2,实现方式代码实现样例【三种方式】:packagecom.cnblogs.mufasa.demo2;importjava.util.concurrent.Callable;public class test1_Runnable implementsRu…

这本免费小书,带你征服 GitHub!

GitHub 漫游指南,一本有趣又通俗的 GitHub 教程,想要成为 star 之王么?今天给大家分享一份通俗易懂的 GitHub 学习教程,即《GitHub 漫游指南》。看过了不下十套 GitHub 教程了,小编愿称它为最强!虽然没有 G…

jQuery formValidator表单验证插件4.1.0 下载 演示 文档 可换肤 代码生成器

更新记录: 2011/6/5 jQuery formValidator 4.1.0 ver申明:1、所有DEMO引用jQuery类库的时候,类库后面直接跟了版本号——表示插件支持的最高类库版本号2、插件的命名:插件名版本号,压缩版:插件名版本号min新增以下功能…

java context.write_Channel.write() 和 ChannelHandlerContext.write() 的区别

版权声明:本文为博主原创文章,未经博主允许不得转载。看了下netty 源代码, 终于明白了Channel.write() 和 ChannelHandlerContext.write() 的区别了网上说的都不是很清楚首先注明我的netty版本io.nettynetty-all4.0.36.FinalChannelPipeline处理ChannelH…

美国劳工部揭露中国女人大数据,看完彻底傻眼了……

导读:“中国人的勤奋,令世界惊叹和汗颜,甚至有一点恐惧。”——科斯,诺贝尔经济学奖得主那么中国人的“勤奋”能否用数据来量化一下呢?答案是可以的。另外,如果以性别来区分,究竟是中国男性更勤…

计算机女神,互联网第一夫人!

大家好,我是鱼皮,今天带大家认识一位计算机领域的女神,有关她的故事非常有趣!先聊聊我是如何认识女神的吧。那是我在大四做毕业设计的时候,误打误撞地选了一个图像处理相关的课题,要做一个显微图像处理分析…

mysql安装目录centos_CentOS mysql安装系统方法

CentOS linux由于同时具有与RHEL的兼容性和企业级应用的稳定性,又允许用户自由使用,因此得到了越来越广泛的应用。1]CentOS mysql安装解压[rootlocalhost root]# cd /usr/local/mysql/software[rootlocalhost software]# lsmysql-4.0.16.tar.gz[rootloca…

不吃不喝,两周业余时间研究(cisco SCE CM )

最近比较忙,比较烦,不想说话,想打人,想发脾气了; 这几天比较累,相当的累,这两个星期什么都不顺心,心情也很低落 这两个星期维护的移动、广电网络都出现问题了,o(︶︿︶)o…

NET问答: 如何从 string 中挖出所有的 number ?

咨询区 van:我现在有一个需求,想从 string 中找到所有的 number 并提取出来。举例如下:string test "1 hello" string test1 " 1 world" string test2 "helloworld 99"请问我该如何做?回答区 Tabares:这个简…

大数据告诉你:学历真的能改变命运

央视新闻曾做过关于高考的调查,结果有七成网友支持高考取消数学,看到新闻后,有一位网友却一针见血地评论道:数学考试存在的意义就是把这七成网友筛选掉。的确,虽然买菜不需要专业数学知识,但数学可以决定我…

mysql控制台教程视频教程_mysql 控制台操作

一、连接mysql数据库1.首先打开cmd进入dos窗口2.切换至目录:D:\MySql5.0\mysql-5.0.51b-win32\bin(即:mysql安装目录下面的bin目录,该目录内有很多exe执行文件)3.键入命令:mysql -uroot -p 回车,提示输入密码&#xff…

Dapr微服务应用开发系列5:发布订阅构建块

题记:这篇介绍发布订阅构建块,这是对事件驱动架构设计的一种实现落地。注:对于“Building Blocks”这个词组的翻译,我之前使用了“构件块”,现在和官方文档(Dapr中文社区的贡献)保持一致&#x…

【资源】机器学习资料包来袭

近几年,机器学习一直很火,小编也有意识地收集了机器学习相关的资源,经过长时间的积累和沉淀,已经拥有将近17G的吴恩达老师、李宏毅老师和王保明老师机器学习资料和视频。现在,小编准备将这些资料免费分享给大家&#x…

poj-2029 Get Many Persimmon Trees

my code: /* * 2029.cpp * * Created on: 2011-7-6 * Author: */#include <iostream>#include <cstring>using namespace std;const int MAXN 100 5;bool tree[MAXN][MAXN] {};    //坐标上是否有树int d[MAXN][MAXN] {};      //一维矩阵上的…

java 字符串 去除_java 字符串中去除特定的字符

java String字符串 去除特定的字符 程序如下package com.xing.test;import java.util.regex.Matcher;import java.util.regex.Pattern;/**** author Yinxing**/public class NotString {public static void main(String[] args) {// TODO Auto-generated method stubString st…

深度学习了40万个表情,一大波AI 表情包来了

自从有了表情包&#xff0c;跟人聊天时的第一反应&#xff0c;就是去找找看有什么适合的表情。有一类表情包&#xff0c;形式是文字图&#xff0c;尤其能够精妙地抒发和传递感情。在这一点上&#xff0c;可能全世界的网友都一样。好用的表情永远不嫌多&#xff0c;而且似乎总是…

网关Ocelot功能演示安排的明明白白~~~

前言网关(Gateway)在微服务架构中至关重要&#xff0c;可以将其理解为是外部客户端(前端、MVC后台等调用方)与后台服务的连接点&#xff0c;通过这层可以做统一的处理&#xff0c;比如路由、身份认证和授权、服务治理等&#xff1b;网关的好处&#xff1a;统一入口&#xff0c;…

今天学习jquery 希望开个好头

暑假和学长们一起做一个项目&#xff0c;是asp.net&#xff0c;看了杨中科老师的视频&#xff0c;虽然只看了后面关于asp.net的部分&#xff0c;但还是感到jquery是十分强大的。所以下定决心&#xff0c;这个暑假搞一搞jquery&#xff0c;感受一下写的更少&#xff0c;做的更多…