转自:http://blog.csdn.net/blueheart20/article/details/18725801

小引: 在当下的Java语言层面上,Annotation已经被应用到了语言的各个方面,它已经在现在的ssh开发中,通过Annotation极大的提高了开发的效率,堪称开发神器。在这篇文章中,我们来了解一下的Annotation在Java中的前身今世吧。

1.   Java Annotation因何而来?

最初从印象中,是可以替代之前JDK1.4开发中,大量繁琐的配置项,Annotation的出现其实可以极大简化配置文件的数量和需要关注配置的内容。在阅读了诸多文章之后,发掘,这个取代配置项只是一个附带的结果,或者是我们开发者从中受益最多的方面罢了。其实,它背后的原因远不是如此。

我们还是引用Wiki百科的观点来综述原因吧,a form of syntactic metadaa that can be added to Java source code,就是说,Annotation的引入是为了从Java语言层面上,为Java源代码提供元数据的支持[参考资料1]。

那第二个问题就来了,何为metadata(元数据)呢 ?

Wiki官方的解释是Metadata is "data about data" [参考资料2],精辟呀,用来描述数据本身的数据。如果我们把Java的源代码看做是数据的话,那么metadata就是为了描述这些源代码而产生和使用的元数据,Annotation就是在Java语言层面上实现了metadata机制。

Metadata分为两个方面的内容:   structural metadata和descriptive metadata,简而言之,就是结构性的元数据和描述性的元数据两种,当然这里的两种划分是否准确有待商榷,但是却让大致明白了它所应用的场景和场合。

那是否有童鞋依然对Metadata一头雾水呢? 下面我们来举几个小例子,帮助大家感知一下元数据吧。

比如我们从网上搜索一部电影的信息,电影本身是一个数据,可以播放和观看娱乐消遣。但我们如何才能找到我们想要的电影呢?想一想,对了,我们可以按照主演、导演、上映时间、影片类型、观众评分、票房收入和发行公司等诸多的信息进行搜索。这些我们搜索的条件,就是我们这里所谓的关于电影本身的metadata,他们都是用来描述电影本身的数据,但是不影响电影本身的播放和观看的。[参考资料3]

2.   Java Annotation的历史简述

在引入Annotation之前,Java中其实已经有了类似的东西,比如transient和@deprecated。在2004年正式被JCP接受,在JDK5中正式引入的,主要是通过开发包中的apt命令来进行处理。 在JDK6中,将其集成到javac, 允许用户自定义Annotation,为用户自行扩展开启了通道。

3.   Annotation在Java中的应用

Annotation在Java可以像public, final等语法修饰一样使用, 用以修饰用于包、类 型、构造方法、方法、成员变量、参数、本地变量的声明中。另外对于允许自定义参数的Annotation还可以在声明中使用参数。

在Java中主要用在以下几个方面:

  •      文档编制

通过@Documented来标注是否需要在javadoc中出现。

  •      编译器检查

通过Annotation的使用,可以调整和控制编译器的使用以及让编译器提供关于代码的更多的检查和验证,比如@Override,@SuppressWarning.

  •     代码分析

这个是我们开发者从中受益良多的部分,通过Annotation的使用,可以让我们在代码运行中动态得去控制系统的行为,从而省去之前诸多的配置和冗余代码。这个会在后续的实例中加以详述。 这里有一点需要说明的是,Annotation不影响已有代码的执行,但是会影响系统在运行中的行为,这两个在不同的层面上,一个是已有的代码执行层,另外一个是JVM会根据Annotation的指令修改系统行为的。

4.  Annotation在Java中的使用方法

下面我们来直接看一个Annotation的例子,感受一下它的威力吧。

 public class AnnotationOverrideTest {
@Override public String toString() { /////--- 可以当做修饰符一样直接使用,非常熟悉吧
return "Override the toString() of the superclass";
} @Override //也可以分为单独一行
public String toString123() { //提示编译错误
return "Override the toString() of the superclass";
} }

大家可以看到@+Annotation的名称就可以直接使用了,这里使用了@Override这个Annotation来让编译器检查toSring()这个方法是否覆盖了基类的方法。如果基类并没有这个方法的话,则会报错。 在toString123()这个方法中,就会提示错误信息:

这个@Override可以帮助我们的攻城师尽可能早的发现代码中隐藏的问题,如果未使用它的话,可能只有在运行过程中,才会有机会发现这个问题,不是吗?

(未完待续, 后续提纲如下,欢迎指正)

5.   Annotation在Java语言中的内置类型介绍

6.  Annotation的类型分类

7.  Annotation的原理实现

8.   如何自定义Annotation

9.  Annotation在Spring中的应用案例分析

10.  总结

Java Annotation原理分析(一)的更多相关文章

  1. Java NIO原理分析

    Java IO 在Client/Server模型中,Server往往需要同时处理大量来自Client的访问请求,因此Server端需采用支持高并发访问的架构.一种简单而又直接的解决方案是“one-th ...

  2. Java Classloader原理分析

       类的加载过程指通过一个类的全限定名来获取描述此类的二进制字节流,并将其转化为方法区的数据结构,进而生成一个java.lang.Class对象作为方法区这个类各种数据访问的入口.这个过程通过Jav ...

  3. Java CAS 原理分析

    1.简介 CAS 全称是 compare and swap,是一种用于在多线程环境下实现同步功能的机制(可以把 CAS 看做乐观锁).CAS 操作包含三个操作数 -- 内存位置.预期数值和新值.CAS ...

  4. Java集合原理分析和知识点大杂烩(多图初学者必备!!)

    一.数据结构 ​ 数据结构就是计算机存储.组织数据的方式. ​ 在计算机科学中,算法的时间复杂度是一个函数,它定性描述了该算法的运行时间,常用O符号来表述. ​ 时间复杂度是同一问题可用不同算法解决, ...

  5. Java ClassLoader 原理分析

    一.ClassLoader(类加载器)的作用 如果一个程序包含不止一个class文件,那么当程序启动时,带有main方法的类的class文件作为程序入口先被JVM加载,然后根据程序调用的需要,再逐步进 ...

  6. Java爬虫原理分析

    当我们需要从网络上获取资源的时候,我们一般的做法就是通过浏览器打开某个网站,然后将我们需要的东西下载或者保存下来. 但是,当我们需要大量下载的时候,这个时候通过人工一个个的去点击下载,就显得太没有效率 ...

  7. Java CAS 原理详解

    1. 背景 在JDK 5之前Java语言是靠 synchronized 关键字保证同步的,这会导致有锁.锁机制存在以下问题: 在多线程竞争下,加锁.释放锁会导致比较多的上下文切换和调度延时,引起性能问 ...

  8. Java Annotation 及几个常用开源项目注解原理简析

    PDF 版: Java Annotation.pdf, PPT 版:Java Annotation.pptx, Keynote 版:Java Annotation.key 一.Annotation 示 ...

  9. Java NIO使用及原理分析(1-4)(转)

    转载的原文章也找不到!从以下博客中找到http://blog.csdn.net/wuxianglong/article/details/6604817 转载自:李会军•宁静致远 最近由于工作关系要做一 ...

随机推荐

  1. shell的执行顺序问题

    &&,||,(),{},& 五个符号的运用 shell脚本执行命令的时候,有时候会依赖于前一个命令是否执行成功.而&&和||就是用来判断前一个命令执行效果的. ...

  2. Linux 学习笔记(一)

    Linux体系结构 下面是Linux体系结构的示意图: 在所有Linux版本中,都会涉及到以下几个重要概念: 内核:内核是操作系统的核心.内核直接与硬件交互,并处理大部分较低层的任务,如内存管理.进程 ...

  3. Hibernate3的DetachedCriteria支持

    Hibernate3支持DetachedCriteria,这是一个非常有意义的特性!我们知道,在常规的Web编程中,有大量的动态条件查询,即用户在网页上面自由选择某些条件,程序根据用户的选择条件,动态 ...

  4. CNN 美国有线电视新闻网 wapCNN WAP 指无线应用通讯协议 ---- 美国有线电视新闻网 的无线应用

    wapCNN  wap指无线应用通讯协议  CNN美国有线电视新闻网   固, wapCNN 美国有线电视新闻网的无线应用 -------------------------------------- ...

  5. matlab怎么定义一个数组

    A=[];n=input('n=');%数组的长度for i=1:n fprintf('a%.0f=',i); x=input('');%分别输入各个数的值 A=[A,x];endA就可以得到长度为n ...

  6. mysql启动报错(mac)

    $mysql ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) ...

  7. 彻底理解数字图像处理中的卷积-以Sobel算子为例

    彻底理解数字图像处理中的卷积-以Sobel算子为例 作者:FreeBlues 修订记录 2016.08.04 初稿完成 概述 卷积在信号处理领域有极其广泛的应用, 也有严格的物理和数学定义. 本文只讨 ...

  8. 关于delphi PAServer 远程调试DLL文件

    用PAServer调试的话会产生一个默认user-connectionname的文件夹,且这个文件夹不能自定义.因此无法使调试的dll文件生成到host主程序所在的文件夹下而导致无法调试. 变通方法: ...

  9. HDU 1864最大报销额 01背包问题

    B - 最大报销额 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit St ...

  10. Solr5.3.1 SolrJ查询索引结果

    通过SolrJ获取Solr检索结果 1.通过SolrParams的方式提交查询参数 SolrClient solr = new HttpSolrClient("http://localhos ...