Java注解

1. 描述-@interface

注解是面向编译器和虚拟机的,是一种描述信息,必须有编译器或虚拟机主动解析它,才能发挥作用。
https://www.zhihu.com/question/47449512/answer/106034220
http://www.importnew.com/17413.html

1.1 元注解-注解其它注解

@Documented	指明拥有这个注解的元素可以被javadoc此类的工具文档化.
@Target		可以注解的程序元素(可多个),该元注解的取值可以为TYPE,METHOD,CONSTRUCTOR,FIELD等(ElementType)
@Inherited	继承,如果被@Inherited元注解所修饰的某个注解对Parent类进行了修饰,则相当于Child类也被该注解所修饰了。
@Retention	注解类的存在阶段,需正确,否则无法得到注解信息,取值(RetentionPolicy)
				SOURCE--编译阶段被移除,不包含在class文件中
				CLASS--编译时注解,包含在class文件中,但运行时移除
				RUNTIME--运行时注解,运行时可以访问到

1.2 内建注解

@Override
@Deprecated
@SuppressWarnings	告诉编译器忽略特定的警告信息

2. 示例

a). 注解方法不能带有参数
b). 注解方法返回值只能是基本类型或基本类型的数组
c). 注解方法可以有默认值

//定义
@Documented		//元注解
@Target(ElementType.METHOD)
@Inherited
@Retention(RetentionPolicy.RUNTIME)
public @interface MethodInfo{			//注解使用@interface来标识
	String author() default 'Pankaj';
	String date();
	int revision() default 1;
	String comments();
}
//使用
public class AnnotationExample {
	@Override
	@MethodInfo(author = 'Pankaj', comments = 'Main method', date = 'Nov 17 2012', revision = 1)
	public String toString() {
	    return 'Overriden toString method';
	}
}

3. 注解的解析

3.1 编译时解析(@Retention=CLASS的)

a). 自定义一个派生自AbstractProcessor的"注解处理类"
b). 重写process函数, 返回值表示注解的使用是都正确
javac编译时指定继承自AbstractProcess的类,会自动调用其process函数。

@Retention(value= RetentionPolicy.CLASS)
public @interface ExpAnnotation {
    String author() default "desneo";
    String comments();
}
 */
@SupportedAnnotationTypes({"test.java.annotationtest.ExpAnnotation"})
public class ExpAnnotationProcess extends AbstractProcessor {
    public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
        for (TypeElement te : annotations) {
            for (Element e : roundEnv.getElementsAnnotatedWith(te)) {
                ExpAnnotation mi = e.getAnnotation(ExpAnnotation.class);
                System.out.println("解析出的comments字段值:"+mi.comments());
            }
        }
        return false;
    }
}
public class TestClass {
    @ExpAnnotation(comments = "注解方法体测试")
    public void sayHello(String ss){
    }
}
//运行,需指定processor
 javac -encoding UTF-8 -processor test.java.annotationtest.ExpAnnotationProcess  test/java/annotationtest/*.java
 解析出的comments字段值:注解方法体测试

3.2 运行时解析

ExpAnnotation.java
@Retention(value= RetentionPolicy.RUNTIME)
public @interface ExpAnnotation {
    String author() default "desneo";
    String comments();
}
TestClass.java
public class TestClass {
    @ExpAnnotation(comments = "注解方法体测试")
    public void sayHello(String ss){
        System.out.println(ss);
    }

    //解析注释
    public static void main(String[] args) {
        Class cls = TestClass.class;
        for( Method method : cls.getMethods() ){
            ExpAnnotation ano = method.getAnnotation(ExpAnnotation.class);
            if( ano != null){
                System.out.println("comments:"+ano.comments());
                System.out.println("method Name:" + method.getName());
            }
        }
    }
}
//运行 java test.java.annotationtest.TestClass
comments:注解方法体测试
method Name:sayHello
原文地址:https://www.cnblogs.com/Desneo/p/7256989.html