- 浏览: 475417 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
fanxp:
很好,学习了!
mysql导入数据load data infile用法 -
maomao15:
...
(转) Class.getResource与ClassLoader.getResource()区别 -
贾懂凯:
有maven的配置吗?
Spring MVC整合Velocity的例子 -
kevinhrw:
一个好办法不知道使用"mvc:resources&q ...
Spring3.0 做rest时候拦截js、图片 -
love_miaohong:
这样子设置没作用啊, window7系统下用这个方式不行
MongoDB在windows操作系统cmd下乱码
Annotation在java的世界正铺天盖地展开,有空写这一篇简单的annotations的文章,算是关于Annotation入门的文章吧,希望能各位们能抛砖,共同学习......
不讲废话了,实践才是硬道理.
第一部分:了解一下java1.5起默认的三个annotation类型:
一个是@Override:只能用在方法之上的,用来告诉别人这一个方法是改写父类的。
一个是@Deprecated:建议别人不要使用旧的API的时候用的,编译的时候会用产生警告信息,可以设定在程序里的所有的元素上.
一个是@SuppressWarnings:这一个类型可以来暂时把一些警告信息消息关闭.
如果不清楚上面三个类型的具体用法,各位可以baidu或google一下的,很简单的。
第二部分:讲一下annotation的概念,再来讲一下怎样设计自己的annotation.
首先在jdk自带的java.lang.annotation包里,打开如下几个源文件:
1
、源文件Target.java
代码
@Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.ANNOTATION_TYPE) public @interface Target { ElementType[] value(); } |
其中的@interface是一个关键字,在设计annotations的时候必须把一个类型定义为@interface,而不能用class或interface关键字(会不会觉得sun
有点吝啬,偏偏搞得与interface这么像).
2、源文件Retention.java
代码
@Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.ANNOTATION_TYPE) public @interface Retention { RetentionPolicy value(); } |
看到这里,大家可能都模糊了,都不知道在说什么,别急,往下看一下.
在上面的文件都用到了RetentionPolicy,ElementType这两个字段,你可能就会猜到这是两个java文件.的确,这两个文件的源代码
如下:
3、源文件RetentionPolicy.java
代码
public enum RetentionPolicy { SOURCE, CLASS, RUNTIME } |
这是一个enum类型,共有三个值,分别是SOURCE,CLASS 和 RUNTIME.
SOURCE代表的是这个Annotation类型的信息只会保留在程序源码里,源码如果经过了编译之后,Annotation的数据就会消失,并不会保留在编译好的.class文件里面。
ClASS的意思是这个Annotation类型的信息保留在程序源码里,同时也会保留在编译好的.class文件里面,在执行的时候,并不会把这一些
信息加载到虚拟机(JVM)中去.注意一下,当你没有设定一个Annotation类型的Retention值时,系统默认值是CLASS.
第三个,是RUNTIME,表示在源码、编译好的.class文件中保留信息,在执行的时候会把这一些信息加载到JVM中去的.
举一个例子,如@Override里面的Retention设为SOURCE,编译成功了就不要这一些检查的信息;相反,@Deprecated里面的
Retention设为RUNTIME,表示除了在编译时会警告我们使用了哪个被Deprecated的方法,在执行的时候也可以查出该方法是否被
Deprecated.
4、源文件ElementType.java
代码
public enum ElementType { TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE, ANNOTATION_TYPE,PACKAGE } |
@Target里面的ElementType是用来指定Annotation类型可以用在哪一些元素上的.说明一下:TYPE(类型),
FIELD(属性), METHOD(方法), PARAMETER(参数),
CONSTRUCTOR(构造函数),LOCAL_VARIABLE(局部变量),
ANNOTATION_TYPE,PACKAGE(包),其中的TYPE(类型)是指可以用在Class,Interface,Enum和
Annotation类型上.
另外,从1的源代码可以看出,@Target自己也用了自己来声明自己,只能用在ANNOTATION_TYPE之上.
如果一个Annotation类型没有指明@Target使用在哪些元素上,那么它可以使用在任何元素之上,这里的元素指的是上面的八种类型.
举几个正确的例子:
@Target(ElementType.METHOD) @Target(value=ElementType.METHOD) @Target(ElementType.METHOD,ElementType.CONSTRUCTOR) |
具体参考一下javadoc文档
上面一下1和2的源文件,它们都使用了@Documented,@Documented的目的就是让这一个Annotation类型的信息能够显示在javaAPI说明文档上;没有添加的话,使用javadoc生成API文档的时候就会找不到这一个类型生成的信息.
另外一点,如果需要把Annotation的数据继承给子类,那么就会用到@Inherited这一个Annotation类型.
第三部分:下面讲的设计一个最简单的Annotation例子,这一例子共用四个文件;
1、Description.java
代码
package lighter.iteye.com; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Description { String value(); } |
说明:所有的Annotation会自动继承java.lang.annotation这一个接口,所以不能再去继承别的类或是接口.
最重要的一点,Annotation类型里面的参数该怎么设定:
第一,只能用public或默认(default)这两个访问权修饰.例如,String value();这里把方法设为defaul默认类型.
第二,参数成员只能用基本类型byte,short,char,int,long,float,double,boolean八种基本数据类型和
String,Enum,Class,annotations等数据类型,以及这一些类型的数组.例如,String
value();这里的参数成员就为String.
第三,如果只有一个参数成员,最好把参数名称设为"value",后加小括号.例:上面的例子就只有一个参数成员.
2、Name.java
代码
package lighter.iteye.com; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; //注意这里的@Target与@Description里的不同,参数成员也不同 @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Name { String originate(); String community(); } |
3、JavaEyer.java
代码
package lighter.iteye.com; @Description("javaeye,做最棒的软件开发交流社区") public class JavaEyer { @Name(originate="创始人:robbin",community="javaEye") public String getName() { return null; } @Name(originate="创始人:江南白衣",community="springside") public String getName2() { return "借用两位的id一用,写这一个例子,请见谅!"; } } |
4、最后,写一个可以运行提取JavaEyer信息的类TestAnnotation
代码
package lighter.iteye.com; import java.lang.reflect.Method; import java.util.HashSet; import java.util.Set; public class TestAnnotation { /** * * 说明:具体关天Annotation的API的用法请参见javaDoc文档 */ public static void main(String[] args) throws Exception { String CLASS_NAME = "lighter.iteye.com.JavaEyer"; Class test = Class.forName(CLASS_NAME); Method[] method = test.getMethods(); boolean flag = test.isAnnotationPresent(Description.class); if(flag) { Description des = (Description)test.getAnnotation(Description.class); System.out.println("描述:"+des.value()); System.out.println("-----------------"); } //把JavaEyer这一类有利用到@Name的全部方法保存到Set中去 Set<Method> set = new HashSet<Method>(); for(int i=0;i<method.length;i++) { boolean otherFlag = method[i].isAnnotationPresent(Name.class); if(otherFlag) set.add(method[i]); } for(Method m: set) { Name name = m.getAnnotation(Name.class); System.out.println(name.originate()); System.out.println("创建的社区:"+name.community()); } } } |
5
、运行结果:
描述:javaeye,做最棒的软件开发交流社区
-----------------
创始人:robbin
创建的社区:javaEye
创始人:江南白衣
创建的社区:springside
发表评论
-
ThreadPoolExecutor线程池参数设置技巧
2017-12-19 13:06 1320一、ThreadPoolExecutor的重要参数 ... -
Java中如何设置使用代理IP发送网络请求
2016-04-20 10:45 1999Java中有两种方法可以实现用代理IP连接网络。 方式一, ... -
JDK并发工具包CompletionService和ExecutorCompletionService的好处和使用场景
2016-04-13 14:06 1806《Java并发编程实践》一书6.3.5节Complet ... -
HttpClient容易忽视的细节——连接关闭
2015-09-06 14:09 1107Java代码 HttpCl ... -
深入浅出 消息队列 ActiveMQ
2015-08-21 10:39 1347一、 概述与介绍 ActiveMQ 是Apach ... -
Java 代码 调用浏览器 打开url (支持多个操作系统)
2014-03-31 14:58 1897package com.ab.galaxy.test.mai ... -
Ant 实战
2013-10-22 10:13 817Ant是什么? Ant是一个构建工具,它可以帮助我们 ... -
30天轻松掌握JavaWeb
2013-10-22 10:07 1131Java Web,是用Java技术来解决相关we ... -
在线文档 doc.gotomao.com
2013-06-24 23:00 71http://doc.gotomao.com/ -
(转) Class.getResource与ClassLoader.getResource()区别
2013-06-04 22:14 1655class.getResource(String res)的 ... -
(转)PV,V,UV的概念,采集数据
2012-10-23 13:08 1161GUID IP+ 随机数 ... -
【转】Atlassian Confluence安装以及如何更改数据库
2012-08-22 16:14 2897Confluence是一个国外的一款商业wiki软 ... -
gzip解压
2011-07-26 12:06 663GZIPInputStream GIS=new GZIPInp ... -
MongoDB在windows操作系统cmd下乱码
2011-05-03 14:13 2881原因:由于mongodb后台的字符编码都是utf-8的, ... -
jstl 的 <fn:> 标签应用(转)
2011-01-09 19:08 1026在jsp页面上经常遇到得到集合长度、字符长度、字符 ... -
mencached入门 pdf
2011-01-03 20:19 945见附件 -
让FCKeditor自动换行
2010-12-21 10:03 1561使用FCKEditor进行文本编辑时,当输入满一行时, ... -
Apache POI组件操作Excel,制作报表(二) (转)
2010-12-19 20:26 1991现在来看看Excel的基本设置问题,以2007为例,先从工作 ... -
Apache POI组件操作Excel,制作报表(一) (转)
2010-12-19 19:32 1154Apache的POI组件是Java操作Microsoft ... -
Velocity手册(5)【转】
2010-12-16 10:10 1259#end </ul> Velocity ...
相关推荐
实战篇:设计自己的Annotation
Java实战篇:设计自己的Annotation.pdf
文档由五篇博客组成,说明了如何使用代理技术实现Annotation HttpClient通过,阅读这五篇博客,应该能够大致了解如何实现一个Annotation类型应用的框架。此外,配备了相应的Annotation HttpClient的源码,以供大家...
Annotation在java的世界正铺天盖地展开,有空写这一篇简单的annotations的文章,算是关于Annotation入门的文章吧,希望能各位们能抛砖,共同学习......
s2sh基于annotation实现零配置的毕业设计(网上花店系统)
毕业设计-s2sh基于annotation实现零配置文件的教务管理系统包含所有的jar包
与类的设计分离,容易产生不一致;实现细粒度较困难等。针对这些问题,结合网络教学系统的开发,提出了一种基于Annotation和拦截器实现访问控制的实现方法。Annotation是在JDK1.5之后的版本中出现的新的用于标注元数据的...
2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。...
23个经典JDK设计模式 下面是JDK中有关23个经典设计模式的示例: Structural(结构模式) Adapter: 把一个接口或是类变成另外一种。 ● java.util.Arrays#asList() ● javax.swing.JTable(TableModel) ● java.io....
那些为可视化报告设计的框架,因此它需要不需要的资源来创建简单的文本列表。 当您有明确定义的报告 bean 时,通过手写代码按格式创建单个报告总是变得乏味的任务。 所以我设计了注释机制来将 Java bean 填充为三...
设计思想及原理使用方法注解(Annotation)说明表达式的应用缓存删除注意事项缓存管理页面与Spring Cache的区别源码阅读已经实现基于aspectj,代码在com.jarvis.cache.aop.aspectj.AspectjAopInterceptor。...
非侵入式设计 快速开始 安装。 go get github.com/1-st/gin-annotation 在任何地方编写您的HandlerFunc。 源代码文件请参见dir: _example / simple // controller/hello.go package controller /* Hello a ...
提出一种基于标注(Annotation)的Java程序中设计模式信息的表示方法。通过定义相关的标注,在程序中标识被实例化的模式信息,如模式名、角色名等。同时,提取程序中的Annotation信息后,根据需要可以对它们作进一步的格式...
Linux内核设计与实现-第三版 Table of Contents 1 Introduction to the Linux Kernel 1 History of Unix 1 Along Came Linus: Introduction to Linux 3 Overview of Operating Systems and Kernels 4 Linux Versus ...
一个注释平台,专为人文学科的教学和学习而设计,具有更广泛的用途。 适用于:MIT批注数据存储 运行此应用程序需要两台服务器。 这一个,以及。 您必须运行注释服务器才能创建或查看注释。 入门 要安装的东西 ...
Help converting LabelMe Annotation Tool JSON format to YOLO text file format. If you've already marked your segmentation dataset by Label… YOLO项目,工具源码,适合毕业设计、课程设计作业,所有源码均...
2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。...
simple_sv_annotation.py是围绕新的注释字段而不是先前的EFF字段设计的。 用法 usage: simple_sv_annotation [options] vcf 必填参数 vcf FILE - vcf file annotated with snpEff v4.1g+ 可选参数 --output/-o FILE...
该存储库包含一个专为高速2D人体姿势标注而设计的工具。 入门 该工具可作为具有Web前端的python Web服务器运行。 要启动服务器,请运行: python run.py --port 8008 --debug 并导航到...
XL命令行界面进行调试用NC Verilog Tcl界面进行调试图形用户界面(GUI)调试延时的计算及反标注(annotation)性能仿真描述如何使用NC Verilog仿真器进行编译及仿真如何将设计环境传送给NC Verilog周期(cycle)仿真课程...