(一)Java1.8核心包rt.jar——java.lang.annotation
1、Annotation
public interface Annotation {
boolean equals(Object obj);
int hashCode();
String toString();
Class<? extends Annotation> annotationType();
}
注解(Annotation),也叫元数据。JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。
注解可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。
注解是以‘@注解名’在代码中存在的,可以通过反射机制编程实现对这些元数据的访问。
注解可以在编译时选择是否只存在于源代码级,或者它也能在class文件、或者运行时中出现(SOURCE/CLASS/RUNTIME)。
2、ElementType
public enum ElementType {
/** 类、接口(包括注解类型)、或枚举声明。@MyAnnotation public class MyClass {} */
TYPE,
/** 字段声明(包括枚举常量)。@MyAnnotation private int myField */
FIELD,
/** 方法声明。@MyAnnotation public void myMethod() {} */
METHOD,
/** 形式参数声明。public void myMethod(@MyAnnotation String param) {} */
PARAMETER,
/** 构造器声明。@MyAnnotation public MyClass(int value) {} */
CONSTRUCTOR,
/**
* 局部变量声明(但注意,Java 注解在 Java 8 之前不能用于局部变量)。
*
* void myMethod() { @MyAnnotation int localVar; }
*/
LOCAL_VARIABLE,
/**
* 注解类型声明。
*
* @MyAnnotation public @interface MyOtherAnnotation {}
*/
ANNOTATION_TYPE,
/**
* 包声明。从 Java 9 开始,注解可以应用于包声明
*
* @MyAnnotation package com.example;
*/
PACKAGE,
/**
* 类型参数声明(Java 8 引入)。
*
* public class MyClass<@MyAnnotation T> {}
*/
TYPE_PARAMETER,
/**
* 类型的使用(Java 8 引入)。这允许注解应用于任何类型的使用,如泛型、强制类型转换等。
*
* public void myMethod(List<@MyAnnotation String> list) {}
*/
TYPE_USE
}
3、RetentionPolicy
public enum RetentionPolicy {
/**
* 标记的注解仅在源代码级别保留,编译器会忽略它。
*/
SOURCE,
/**
* 标记的注解在编译时由编译器保留,但被Java虚拟机(JVM)忽略。
*/
CLASS,
/**
* 标记的注解由JVM保留,因此它可供运行时环境使用。
*/
RUNTIME
}
4、示例
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface TestMethod{
public String name() default "name";
public boolean defaultValue() default false;
}
public class ReadAnnotationInfoTest {
public static void main(String[] args) throws Exception {
// 得到目标的类对象
Class c = Class.forName("com.xxx.xxx.AnnotationTest");
// 获取该类所有声明的方法
Method[] methods = c.getDeclaredMethods();
// 声明注解集合
Annotation[] annotations;
// 遍历所有的方法得到各方法上面的注解信息
for (Method method : methods) {
// 获取每个方法上面所声明的所有注解信息
annotations = method.getDeclaredAnnotations();
// 再遍历所有的注解,打印其基本信息
System.out.println(method.getName());
for (Annotation an : annotations) {
System.out.println("方法名为:" + method.getName() + "其上面的注解为:" + an.annotationType().getSimpleName());
Method[] meths = an.annotationType().getDeclaredMethods();
// 遍历每个注解的所有变量
for (Method meth : meths) {
System.out.println("注解的变量名为:" + meth.getName());
}
}
}
}
}