1. 什么是注解

注解是 Java 5 的一个新特性。注解是插入你代码中的一种注释或者说是一种元数据(meta data)。这些注解信息可以在编译期使用预编译工具进行处理(pre-compiler tools),也可以在运行期使用 Java 反射机制进行处理。下面是一个类注解的例子:

@MyAnnotation(name="someName",  value = "Hello World")
public class TheClass {
}

注解的处理除了可以在运行时通过反射机制处理外,还可以在编译期进行处理,参考这个

2. 元注解/自定义注解

元注解的作用就是负责注解其他注解。Java5.0定义了4个标准的meta-annotation类型,它们被用来提供对其它 annotation类型作说明。Java5.0定义的元注解:
 1.@Target,
 2.@Retention,
 3.@Documented,
 4.@Inherited
这些类型和它们所支持的类在java.lang.annotation包中可以找到。下面我们看一下每个元注解的作用和相应分参数的使用说明。 元注解和自定义注解的具体内容参考这里

3. 利用Java反射机制可以在运行期处理注解信息

你可以在运行期访问类,方法或者变量的注解信息.其核心还是反射.
看个例子:

package com.demo.java;

import java.lang.annotation.Annotation;
import java.lang.reflect.Method;

@MyAnnotation(value = "test for class ", url = "www.baidu.com")
public class AnnotationUsageTest {

    @Deprecated
    @MyAnnotation(value = "test for method", url = "www.google.com")
    public void myMethod() {

        System.out.println("my method have been used!");
    }

    public void outPutUrl(@MyAnnotation(
            value = "test for params",
            url = "www.bing.com") String kind) throws Exception {

        Class<AnnotationUsageTest> c = AnnotationUsageTest.class;
        Method method = c.getMethod("outPutUrl", new Class[]{String.class});
        Annotation[][] parameterAnnotations = method.getParameterAnnotations();
        Class[] params = method.getParameterTypes();
        int i = 0;
        for (Annotation[] annotations : parameterAnnotations) {
            Class param = params[i];
            for (Annotation annotation : annotations) {
                if (annotation instanceof MyAnnotation) {
                    MyAnnotation myAnnotation = (MyAnnotation) annotation;
                    System.out.println("value is :" + myAnnotation.value());
                    System.out.println("url is" + myAnnotation.url());
                }
            }
        }
    }

    public static void main(String[] args) throws Exception {
        //1.访问方法的所有注解
        Class<AnnotationUsageTest> c = AnnotationUsageTest.class;
        Method method = c.getMethod("myMethod", new Class[]{});

        Annotation[] annotations = method.getDeclaredAnnotations();
        for (Annotation annotation : annotations) {
            if (annotation instanceof MyAnnotation) {
                MyAnnotation myAnnotation = (MyAnnotation) annotation;
                System.out.println(myAnnotation.value());
                System.out.println(myAnnotation.url());
            } else {
                System.out.println(annotation.toString());
            }
        }

        //2. 访问方法的特定的注解
        if (method.isAnnotationPresent(MyAnnotation.class)) {
            AnnotationUsageTest test = new AnnotationUsageTest();
            method.invoke(test, new Object[]{});
            MyAnnotation myAnnotation_certain = method.getAnnotation(MyAnnotation.class);
            System.out.println("method annotation test 2:" + myAnnotation_certain.value() + " and url is :" + myAnnotation_certain.url());
        }

        //3. 访问类注解
        Class<AnnotationUsageTest> classType = AnnotationUsageTest.class;
        Annotation[] annotation_array = classType.getDeclaredAnnotations();
        for (Annotation annotation : annotation_array) {
            if (annotation instanceof MyAnnotation) {
                MyAnnotation myAnnotation = (MyAnnotation) annotation;
                System.out.println(myAnnotation.value());
                System.out.println(myAnnotation.url());
            }
        }

        //4.测试参数注解
        //将注解的获取放到方法本身里面了,同样可以运行
        AnnotationUsageTest annotationUsageTest = new AnnotationUsageTest();
        annotationUsageTest.outPutUrl(null);


    }
}
package com.demo.java;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(value = RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
 String value() default "test for annotation";
    String url();
}

主要参考的是[http://tutorials.jenkov.com/java-reflection/annotations.html]

另外,这个文章里的例子也不错.(http://www.cnblogs.com/peida/archive/2013/04/26/3038503.html)
下面的图也是COPY自这个文章的.

clipboard.png


insistcwr
15 声望1 粉丝

喜欢JAVA开发, 数据分析


下一篇 »
Java反射

引用和评论

0 条评论