Java注解入门

第一部分:了解一下java1.5起默认的三个annotation类型
一个是@Override:只能用在方法之上的,用来告诉别人这一个方法是改写父类的。
一个是@Deprecated:建议别人不要使用旧的API的时候用的,编译的时候会产生警告信息,可以设定在程序里的所有的元素上.
一个是@SuppressWarnings:这一个类型可以用来暂时把一些警告信息消息关闭.

第二部分:讲一下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)

上面一下1和2的源文件,它们都使用了@Documented,@Documented的目的就是让这一个Annotation类型的信息能够显示在javaAPI说明文档上;没有添加的话,使用javadoc生成API文档的时候就会找不到这一个类型生成的信息.

另外一点,如果需要把Annotation的数据继承给子类,那么就会用到@Inherited这一个Annotation类型.

第三部分:Annotation例子
1、Description.java

package com.ljq.test;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;@Documented
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Description {String value();
}

第一,只能用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 com.ljq.test;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里的不同,参数成员也不同  
@Documented  
@Target(ElementType.METHOD)   
@Retention(RetentionPolicy.RUNTIME)   
public @interface Name {   String originate();   String community();   
}  

3、JavaEyer.java

package com.ljq.test;@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 com.ljq.test;import java.lang.reflect.Method;
import java.util.HashSet;
import java.util.Set;public class TestAnnotation {public static void main(String[] args) throws Exception {String CLASS_NAME = "com.ljq.test.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

本文章摘抄自网络。

转载于:https://www.cnblogs.com/linjiqin/p/4441691.html

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

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

相关文章

AspNetCms 国内×××聚

国内CMS&#xff1a; 1.SiteServer CMS SiteServer CMS 网站内容管理系统&#xff08;著作权登记号2008SR15710&#xff09;是定位于中高端市场的CMS内容管理系统&#xff0c;能够以最低的成本、最少的人力投入在最短的时间内架设一个功能齐全、性能优异、规模庞大的网站平台。…

java语言中的 继承_Java语言有关继承的总结

一、继承1、继承的概念继承机制是面向对向程序设计不可缺少的关键概念&#xff0c;是实现软件可重用的根基&#xff0c;是提高软件系统的可扩张性与可维护性的主要途径。(它允许创建分等级层次的类)。继承是指一个类的定义可以基于另一个已经存在的类&#xff0c;即子类基于父类…

[转]ssh常用用法小结

ssh常用用法小结 1、连接到远程主机&#xff1a; 命令格式 &#xff1a; ssh nameremoteserver 或者 ssh remoteserver -l name 说明&#xff1a;以上两种方式都可以远程登录到远程主机&#xff0c;server代表远程主机&#xff0c;name为登录远程主机的用户名。 2、连接到远程主…

正则基础之——反向引用

From: http://blog.csdn.net/lxcnn/article/details/4476746 1 概述 捕获组捕获到的内容&#xff0c;不仅可以在正则表达式外部通过程序进行引用&#xff0c;也可以在正则表达式内部进行引用&#xff0c;这种引用方式就是反向引用。要了解反向引用&#xff0c;首先要了…

Android教程之android平台水波效果!提供源码!

基于Android平台实现的水波效果&#xff0c;提供源码&#xff0c;&#xff0c;效果图如下&#xff1a;

java文件全是数字编码_批量将Java源代码文件的编码从GBK转为UTF-8

最近在做一个项目&#xff0c;需要从以前的另外一个项目迁移大量源代码过来&#xff0c;但是由于另一个项目采用GBK编码格式&#xff0c;而新项目采用的UTF-8编码格式&#xff0c;如果直接把Java源代码复制到Eclipse中所有的中文信息都出现乱码。将文本文件的编码格式从GBK转UT…

对于 IE低版本不兼容问题的处理

坑爹的IE低版本浏览器总是需要我们去编写特殊的代码才可以&#xff0c;脑残的我之前总是编写一套CSS&#xff0c;让页面在Firefox、Chorme等牛逼闪闪的浏览器与IE这SB浏览器中的显示差不多&#xff0c;差不多&#xff0c;谁懂么&#xff0c;好好的网页改得真是让人心塞&#xf…

vim中正则表达式匹配单词边界

一般的高级语言中匹配单词边界用的是"\b"&#xff0c;匹配非单词边界用"\B"。 但是在vim中使用\b&#xff0c;发现不认识。上网搜索了一番&#xff0c;终于找到了&#xff1a; 匹配单词左边界&#xff1a;\< 匹配单词右边界&#xff1a;\> 至于匹…

C++对象内存布局--④VS编译器--单个虚拟继承

C对象内存布局--④VS编译器--单个虚拟继承 在VS2005编译器下&#xff0c;证明单个虚拟继承的内存布局&#xff1a;无论有无虚函数&#xff0c;必然含有虚基类表指针。虚基类表中的内容为本类实例的偏移和基类实例的相对偏移值。 如果有虚函数&#xff0c;那么基类的虚函数表跟派…

mysql 存取字符集_MySQL字符集设置—MySQL数据库乱码问题详解

MySQL(4.1以后版本) 服务器中有六个关键位置使用了字符集的概念&#xff0c;他们是&#xff1a;client 、connection、database、results、server 、system。MySQL有两个字符集概念&#xff1a;一个就是字符集本身&#xff0c;一个是字符集校验规则。字符集影响数据在传输和存储…

Eclipse --Type /com.xx.app/gen already exists but is not a source folde解决方案

两种解决方案&#xff1a;Two actions, first:1.Right click on the project and go to "Properties" 2.Select "Java Build Path" on the left 3.Open "Source" tab 4.Click "Add Folder..." and check "gen" and "sr…

浮点数表示及其实现

From: http://blog.csdn.net/biblereader/article/details/819428 我两年前就知道不应该用号来判断浮点数的相等了,因为存在一个精度的问题,但是一直以来,都没怎么在乎这些东西,而实际上,我对于浮点数的结构,虽然了解,但并不清晰. 作为一个C爱好者,应该尽量搞清楚每一个问题,所…

利用HttpSessionListener实现网站在线人数统计功能

为什么80%的码农都做不了架构师&#xff1f;>>> 在网站中经常需要进行在线人数的统计。过去的一般做法是结合登录和退出功能&#xff0c;即当用户输入用户名密码进行登录的时候计数器加1&#xff0c;然后当用户点击退出按钮退出系统的时候计数器减1。这种处理方式存…

java中退订程序怎么写_如何在RxJava中的自定义Observable中获得观察者的退订操作的通知...

订阅者抽象类实际上有一个方法add,可以添加将取消订阅订阅的订阅.def myObservable Observable.create({ aSubscriber ->val listener {event ->aSubscriber.onNext(event);}existingEventSource.addListener(listener)// Adds a lambda to be executed when the Subsc…

UITableViewCell在非Nib及Cell重用下设置CellStyle

在UITableViewController&#xff08;实现了UITableViewDataSource&#xff09;下需要实现 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath; 此接口就是使用数据初始化一个Cell视图并返回&#xff0c;我们可以每次创…