Java 自动1.5以来开始引用了注解,而现在所有的流行框架 几乎将注解的发挥到极致。这里 从以下 来分析一下Java的注解
通过以下 的列子 来简单分析Java的注解
一。创建自定义注解
package com.study.test; import java.lang.annotation.*; /** * Created by baidoufu on 2017/12/9. */ @Target({ElementType.METHOD, ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) @Inherited @Documented public @interface MyMessage { String name() default "sam"; int num() default 0; String desc(); }
简单说明一下上面类中@Targer 、@Retention、@Inherited、@Documented。@Targer 、@Retention、@Inherited、@Documented这四个为原注解(meta-annotation),他们主要是负责注解其他注解的。
1.Target:指明注解支持的使用范围,取值可以参考ElementType枚举,一下:
●ElementTyoe.TYPE //类,接口,枚举
●ElementType.FIELD //属性
●ElementType.METHOD //方法
●ElementType.PARAMETER //参数
●ElementType.CONSTRUCTOR //构造器
●ElementType.LOCAL_VARIABLE //局部变量
●ElementType.ANNOTATION_TYPE //注解
●ElementType.PACKAGE //包
2.Retention:指明注解保留的时间的长短,取值参考RetentionPolicy,如下
●SOURCE // 源文件中保留
●CLASS //编译的时候保留
●RUNTIME //运行时保留
3.Inheritied :指明该注解类型被自动继承。如果一个annotation注解被@Intertied修饰,那么该注解作用与类的子类也会使用该annotation注解
4.Documented:指明拥有这个注解的元素可以被javadoc此类的工具文档化
二。创建测试类,使用自定义注解
package com.study.test; /** * Created by baidoufu on 2017/12/9. */ public class AnnotationTest { @MyMessage(num=10,desc="参数a") private static int a; @MyMessage(name="sam test",desc="测试方法test") public void test(){ System.out.println("test"); } }
在上面的类中 使用了自定义注解,并指明了参数和。现在 来解析一下上面的自定义注解
三。解析自定义注解
package com.study.test; import java.lang.reflect.Field; import java.lang.reflect.Method; /** * Created by Auser on 2017/12/9. */ public class MyMessageProcessor { public static void main(String args[]){ try { Class clazz = MyMessageProcessor.class.getClassLoader().loadClass("com.study.test.AnnotationTest"); Field fields[]=clazz.getDeclaredFields(); for(Field field:fields){ MyMessage myMessage=field.getAnnotation(MyMessage.class); System.out.println("name="+myMessage.name()+" num="+myMessage.num()+" desc="+myMessage.desc()); } Method methods[]=clazz.getDeclaredMethods(); for(Method method:methods){ MyMessage myMessage=method.getAnnotation(MyMessage.class); System.out.println("name="+myMessage.name()+" num="+myMessage.num()+" desc="+myMessage.desc()); } }catch (ClassNotFoundException e){ e.printStackTrace(); } } }
运行MyMessageProcessor 得到结果:
name=sam num=10 desc=参数a name=sam test num=0 desc=测试方法test Process finished with exit code 0
具体定制注解所实现的内容,可以在MyMessageProcessor.java中进行修改。
自此,已经对java的自定义注解有简单的了解。
浙公网安备 33010602011771号