用户工具


注解的作用

注解相当于对类,方法,字段等额外的说明,但又不止于此。因为注解内容可以通过反射机制获得。我们可以利用注解+反射机制将一些复杂的操作隐藏起来

注解+反射机制将一些复杂的操作隐藏起来

注解

package cc;

import java.lang.annotation.*;


@Retention(RetentionPolicy.RUNTIME)
// 作用范围
// RetentionPolicy.SOURCE   :只在源码级别生效
// RetentionPolicy.CLASS    :在编译级别生效,主要是给编译器使用,如overwrite注解
// RetentionPolicy.RUNTIME  :在运行时生效,这种方式最常用。用于在运行时改变执行方式,一般通过反射的方式获取注解,并根据注解来决定下一步如何处理
@Target({ElementType.METHOD, ElementType.TYPE})
// 注解用于哪些地方
// ElementType.TYPE         :用于类、接口
// ElementType.METHOD       :用于方法
// ElementType.CONSTRUCTOR  :用于构造函数
// ElementType.FIELD        :用于属性
@Inherited
// 是否可以被继承
// 假设A是接口,且A上有注解@MyAnnoation。如果B类继承A类,那也会同时继承A类上的注解,但是A类中方法的注解无法被继承。
// 假设A是类,  且A上有注解@MyAnnoation。如果B类继承A类,B无法继承任何注解
@Documented
// 是否可以导出java doc
public @interface MyAnnoation {
    // 如果只有一个值,那默认就是value
    int age();
    String value();
}

使用注解

package cc;

/**
 * Created by fang on 16/9/27.
 */
@MyAnnoation(value = "class user",age=10)
public class User {

    @MyAnnoation(value = "method1", age=11)
    public void show(){
        System.out.println("method1");
    }

    @MyAnnoation(value = "method2", age=12)
    public void show1(){
        System.out.println("method2");
    }
}

解析注解

    public static void main(String[] args) throws InvocationTargetException, IllegalAccessException {
        for(Method m:User.class.getMethods()){
            for(Annotation annotation:m.getAnnotations()){

                String annotationName = annotation.annotationType().getName();
                if(annotationName.equals("cc.MyAnnoation")){
                    System.out.print("age: " + ((MyAnnoation) annotation).age());
                    System.out.print(", value: "+((MyAnnoation) annotation).value());
                    System.out.print(", MyAnnoation: ");
                    m.invoke(new User());
                }
            }
        }
        System.out.println(User.class.getAnnotation(MyAnnoation.class).value());
    }