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的自定义注解有简单的了解。