Annotation(注解)是 Java 提供的一种对元程序中元素关联信息和元数据(metadata)的途径和方法。Annatation(注解)是一个接口,程序可以通过反射来获取指定程序中元素的 Annotation对象,然后通过该 Annotation 对象来获取注解中的元数据信息。
自定义注解
import java.lang.annotation.*;
/**
* @author ringleader
* @Description 自定义注解
* @date 2020/6/10
*/
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD,ElementType.METHOD,ElementType.TYPE})
@Documented
public @interface TestAnnotation {
String description() default "";
String name();
/**
* 1.注解声明
* 由@interface声明ClassAnnotation为注解类型,注意比interface多了个@符号。
* 2.注解的属性
* 上面定义了两个属性:String类型的description属性,默认值为空字符串;String类型的name属性.注意虽然后面带了括号,但并不是方法。如果注解内部只定义了一个属性,该属性名通常为value,且在使用的时候可以省略value=,直接写值。
* 注解的属性类型支持的类型有:所有基本类型,String,Class,enum,Anotation以及上述类型的数组类型。
* */
}
带注解的实体类
/**
* @author ringleader
* @Description 带注解的实体类
* @date 2020/6/10
*/
@TestAnnotation(name = "类注解name",description = "类注解说明")
public class Test {
@TestAnnotation(name = "属性注解name1",description = "属性注解说明1")
int size;
@TestAnnotation(name = "属性注解name2",description = "属性注解说明2")
int id;
@TestAnnotation(name = "方法注解name1",description = "方法注解说明1")
int getSize(){
return this.size;
}
@TestAnnotation(name = "方法注解name2",description = "方法注解说明2")
void setSize(int x){
this.size=x;
}
}
运行时注解解析器
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
* @author ringleader
* @Description 运行时注解解析器
* @date 2020/6/10
*/
public class TestAnnotationParse {
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException {
Class clazz = Class.forName("知识点验证.注解.功能测试1.Test");
//获取类注解信息
TestAnnotation classAnnotation = (TestAnnotation) clazz.getAnnotation(TestAnnotation.class);
System.out.println(classAnnotation.description()+ " "+classAnnotation.name()+"\n");
//获取所有方法注解信息 ,ps:这里需要使用 isAnnotationPresent 判断方法上是否使用了注解
Method[] declaredMethods = clazz.getDeclaredMethods();
for (Method method:declaredMethods){
/*System.out.println("TestAnnotation.class:"+TestAnnotation.class);//知识点验证.注解.测试1.TestAnnotation
System.out.println("testAnnotation.getClass():"+TestAnnotation.class);//class com.sun.proxy.$Proxy1*/
if (method.isAnnotationPresent(TestAnnotation.class)){
TestAnnotation methodAnnotation = method.getAnnotation(TestAnnotation.class);
System.out.println(method.getName()+"方法的注解信息为:");
System.out.println(methodAnnotation.name());
System.out.println(methodAnnotation.description()+"\n");
}
}
//获取属性注解信息
Field[] declaredFields = clazz.getDeclaredFields();
for (Field field:declaredFields){
if (field.isAnnotationPresent(TestAnnotation.class)){
TestAnnotation fieldAnnotation = field.getAnnotation(TestAnnotation.class);
System.out.println(field.getName()+"字段的注解信息为:");
System.out.println(fieldAnnotation.description());
System.out.println(fieldAnnotation.name()+"\n");
}
}
//获取指定属性注解信息
Field id = clazz.getDeclaredField("id");
System.out.println(id.getName()+"指定字段的注解信息为:");
System.out.println(id.getAnnotation(TestAnnotation.class).description());
}
}