一个是@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版权声明:本文为博主原创文章,未经博主允许不得转载。