Java Annotation原理分析(一)
转自: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原理分析(一)的更多相关文章
- Java NIO原理分析
Java IO 在Client/Server模型中,Server往往需要同时处理大量来自Client的访问请求,因此Server端需采用支持高并发访问的架构.一种简单而又直接的解决方案是“one-th ...
- Java Classloader原理分析
类的加载过程指通过一个类的全限定名来获取描述此类的二进制字节流,并将其转化为方法区的数据结构,进而生成一个java.lang.Class对象作为方法区这个类各种数据访问的入口.这个过程通过Jav ...
- Java CAS 原理分析
1.简介 CAS 全称是 compare and swap,是一种用于在多线程环境下实现同步功能的机制(可以把 CAS 看做乐观锁).CAS 操作包含三个操作数 -- 内存位置.预期数值和新值.CAS ...
- Java集合原理分析和知识点大杂烩(多图初学者必备!!)
一.数据结构 数据结构就是计算机存储.组织数据的方式. 在计算机科学中,算法的时间复杂度是一个函数,它定性描述了该算法的运行时间,常用O符号来表述. 时间复杂度是同一问题可用不同算法解决, ...
- Java ClassLoader 原理分析
一.ClassLoader(类加载器)的作用 如果一个程序包含不止一个class文件,那么当程序启动时,带有main方法的类的class文件作为程序入口先被JVM加载,然后根据程序调用的需要,再逐步进 ...
- Java爬虫原理分析
当我们需要从网络上获取资源的时候,我们一般的做法就是通过浏览器打开某个网站,然后将我们需要的东西下载或者保存下来. 但是,当我们需要大量下载的时候,这个时候通过人工一个个的去点击下载,就显得太没有效率 ...
- Java CAS 原理详解
1. 背景 在JDK 5之前Java语言是靠 synchronized 关键字保证同步的,这会导致有锁.锁机制存在以下问题: 在多线程竞争下,加锁.释放锁会导致比较多的上下文切换和调度延时,引起性能问 ...
- Java Annotation 及几个常用开源项目注解原理简析
PDF 版: Java Annotation.pdf, PPT 版:Java Annotation.pptx, Keynote 版:Java Annotation.key 一.Annotation 示 ...
- Java NIO使用及原理分析(1-4)(转)
转载的原文章也找不到!从以下博客中找到http://blog.csdn.net/wuxianglong/article/details/6604817 转载自:李会军•宁静致远 最近由于工作关系要做一 ...
随机推荐
- delphi基本语法
本文参考自<delphi2010语法手册> 1. 工程文件结构 源文件联系着unit单元,delphi主模块源文件格式为.dpr,其他模块为.pas,一个完整程序由一个.dpr和若干.pa ...
- phpcms下载下来的程序刚安装就报错了
你服务器设置的索引等级 index.php比index.html的等级高.你输入地址 http://你的域名/index.html试试. ( ! ) Warning: array_keys() exp ...
- 和我一起来了解SEO
基础知识 搜索引擎 搜索引擎爬虫会检索各个网站,分析他们的关键字,从一个连接到另一个连接,如果爬虫觉得这个关键字是有用的 就会存入搜索引擎数据库,反之如果没用的.恶意的.或者已经在数据库的,就会舍弃. ...
- FineUI第四天---PageManage的概述
页面级别的配置PageManager控件的配置 每一个使用FineUI控件的页面都必须包含一个PageManager控件,我们可以把PageManager控件看做页面级别的参数配置(相对于Web.co ...
- 在VMware上面安装Solaris 10
导读 Oracle Solaris 11 是世界上最先进的企业操作系统,提供安全.速度.简单的企业云环境和DevOps.在这篇文章中我们将使用Solaris 10版本,但您可以按照同样的步骤,来安装刚 ...
- Xcode 5.0.2 下载地址
下载地址:http://adcdownload.apple.com/Developer_Tools/xcode_5.0.2/xcode_5.0.2.dmg command_line_tools_os_ ...
- ruby on rails揭开route路由的真面目
文章是从我的个人主页上粘贴过来的, 大家也可以访问我的主页 www.iwangzheng.com 最近的项目里发现一个问题,大师和pp写的index页面就好使,我写index页面就不往index页面跳 ...
- [BZOJ1941][Sdoi2010]Hide and Seek
[BZOJ1941][Sdoi2010]Hide and Seek 试题描述 小猪iPig在PKU刚上完了无聊的猪性代数课,天资聪慧的iPig被这门对他来说无比简单的课弄得非常寂寞,为了消除寂寞感,他 ...
- 坚持不懈之linux haproxy 配置文件 详情
####################全局配置信息######################## #######参数是进程级的,通常和操作系统(OS)相关######### global maxc ...
- Linux 查看网络连接状态
CLOSED:无连接是活动的或正在进行ESTABLISED:已建立连线的状态:SYN_SENT:发出主动连线 (SYN 标志) 的连线封包:SYN_RECV:接收到一个要求连线的主动连线封包:FIN_ ...