博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java annotation注解
阅读量:6087 次
发布时间:2019-06-20

本文共 4970 字,大约阅读时间需要 16 分钟。

hot3.png

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

   一个是@SuppressWarnings:这一个类型可以来暂时把一些警告信息消息关闭. 

 第二部分:讲一下annotation的概念先,再来讲一下怎样设计自己的annotation. 

   首先在jdk自带的java.lang.annotation包里,打开如下几个源文件: 

1.@Target此注解的源码如下,注解中有个ElementType 经查看源码是个枚举类型

@Documented@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.ANNOTATION_TYPE)public @interface Target {    ElementType[] value();}
2.
ElementType是@Target中的一个枚举类型,主要用来声明注解的地方是  TYPE(类,接口...) ,FIELD(属性),METHOD(方法),PARAMETER(参数),CONSTRUCTOR(构造方法)

LOCAL_VARIABLE(局部变量) ANNOTATION_TYPE(注解),PACKAGE(包)

public enum ElementType {    /** Class, interface (including annotation type), or enum declaration */    TYPE,    /** Field declaration (includes enum constants) */    FIELD,    /** Method declaration */    METHOD,    /** Parameter declaration */    PARAMETER,    /** Constructor declaration */    CONSTRUCTOR,    /** Local variable declaration */    LOCAL_VARIABLE,    /** Annotation type declaration */    ANNOTATION_TYPE,    /** Package declaration */    PACKAGE}
3.@Retention
@Documented@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.ANNOTATION_TYPE)public @interface Retention {    RetentionPolicy value();}
4.RetentionPolicy

public enum RetentionPolicy {    SOURCE,    CLASS,    RUNTIME}
RetentionPolicy这是一个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. 

由此可以看出@Retention是干嘛用的了吧 ?

另附:@Documented的目的就是让这一个Annotation类型的信息能够显示在javaAPI说明文档上;没有添加的话,使用javadoc生成API文档的时候就会找不到这一个类型生成的信息. 

   另外一点,如果需要把Annotation的数据继承给子类,那么就会用到@Inherited这一个Annotation类型. 
第三部分:下面讲的设计一个最简单的Annotation例子; 

package com.yun.study.webdemo.annotation;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 ClassDescription {	String desc();	String fmtDesc();}
package com.yun.study.webdemo.annotation;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.METHOD)@Retention(RetentionPolicy.RUNTIME)@ClassDescription(desc="自定义方法上的注解类",fmtDesc="[自定义方法上的注解类]")public @interface MyMethodAnno {	String modifier();	String returnType();}

package com.yun.study.webdemo.annotation;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.FIELD)@Retention(RetentionPolicy.RUNTIME)@ClassDescription(desc="自定义属性注解类",fmtDesc="[自定义属性注解类]")public @interface MyFiledAnno {	/**	 * 属性类型	 */	String filedType();	}
package com.yun.study.webdemo.annotation;import java.lang.annotation.Annotation;import java.lang.reflect.Field;import java.lang.reflect.Method;public class TestAnno {	public static void main(String[] args) throws Exception {		Class user = Class.forName("com.yun.study.webdemo.model.User");				boolean isAnnoDesc = user.isAnnotationPresent(ClassDescription.class);				if(isAnnoDesc){			ClassDescription des = (ClassDescription) user.getAnnotation(ClassDescription.class);			System.out.println("Description des:"+des.desc());			System.out.println("Description fmtdes:"+des.fmtDesc());			System.out.println("=============================================");		}		Method[] ms = user.getMethods();		for(Method m : ms){			MyMethodAnno myMethod = m.getAnnotation(MyMethodAnno.class);			if (myMethod==null) continue;			String modifier = myMethod.modifier();			String rtype = myMethod.returnType();			System.out.println("MyMethodAnno modifier:"+modifier);			System.out.println("MyMethodAnno returnType:"+rtype);		}		System.out.println("=============================================");		Field[] fs = user.getFields();		for(Field f : fs){			MyFiledAnno myFiled = f.getAnnotation(MyFiledAnno.class);			if (myFiled==null) continue;			String filedType = myFiled.filedType();			System.out.println("MyFiledAnno filedType:"+filedType);		}	}}
测试类输出信息如下:

Description des:用户信息描述类

Description fmtdes:[格式化的用户信息描述]
=============================================
MyMethodAnno modifier:public
MyMethodAnno returnType:String
=============================================
MyFiledAnno filedType:Long
MyFiledAnno filedType:String

版权声明:本文为博主原创文章,未经博主允许不得转载。

转载于:https://my.oschina.net/duanyunhu/blog/478117

你可能感兴趣的文章
设置防止攻击session(疑惑)
查看>>
PHP 服务器及TP5框架遇到的几个错误
查看>>
用VMware克隆CentOS 6.5如何进行网络设置
查看>>
redis conf文件详解(转)
查看>>
7月心情
查看>>
jsp jsp九个内置对象
查看>>
PHP(六)PHP和HTML混合的一种形式
查看>>
前端Js框架汇总
查看>>
Cooperation.GTST团队第一周项目总结
查看>>
递归遍历二叉树
查看>>
图标网站收藏
查看>>
jquerymobile changepage 无法加载外部js文件解决办法
查看>>
终结2011,吹响2012的号角
查看>>
mysql 免安装版安装(window7)
查看>>
创建可以销毁的对象代码段
查看>>
python链家网高并发异步爬虫asyncio+aiohttp+aiomysql异步存入数据
查看>>
python fabric实现远程操作和部署
查看>>
html实现用户注册页面(表单+表格)——html小练习
查看>>
WebService开发常见问题
查看>>
Tomcat 部署方式
查看>>