注解
元注解:
@Target:注解的作用目标
注解使用范围ElementType里面有type(类)Field(属性),method(方法)。。。
@Retention:注解的生命周期
RetentionPolicy有三个Source(只存在源文件中,不会在clas文件中)。
class(不仅出现在源文件中,也在编译后的class文件中)
RUNTIME(运行时有效)
@Documented:注解是否应当被包含在javaDoc中
自定义注解:
语法
public @interface TestAnnotation {
修饰符 返回值 属性名() 默认值;
}
//自定义注解
@Target(ElementType.FIELD)//作用在属性上
@Retention(RetentionPolicy.RUNTIME)//运行时生效
public @interface PersonInfo {
//这里只能是方法名,不能是其他的
//姓名
public String name();
//年龄
public int age() default 19;
//性别
public String sex() default "男";
//语言
public String[] landuage();
}
注解的使用:
1.定义两个注解
@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface CourseInfo {
//课程名称
public String courseName();
//课程标签
public String courseTag();
//课程简介
public String courseProfile();
//课程序号
public int courseIndex() default 301;
}
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface PersonInfo {
//姓名
public String name();
//年龄
public int age() default 19;
//性别
public String sex() default "男";
//语言
public String[] landuage();
}
2.使用注解:
@CourseInfo(courseName = "spring课程",courseTag = "这是标签",courseIndex = 99,courseProfile = "这是简介")
public class CourseTest {
@PersonInfo(name = "bear",landuage = {"php","java"})
private String author;
@CourseInfo(courseName = "java课程2",courseTag = "这是标签2",courseIndex = 103,courseProfile = "这是简介3")
public void getCourseInfo(){
}
}
3.通过反射获取注解里的东西
package demo.annotation;
import lombok.SneakyThrows;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
//通过反射来获取注解里的属性
public class AnnotationDemo {
@SneakyThrows
public static void parseTypeAnnotation(){
Class clazz = Class.forName("demo.annotation.CourseTest");
//这里只获取了类上面的注解,而不是成员变量和方法的注解
Annotation[] annotations = clazz.getAnnotations();
for (Annotation annotation : annotations){
CourseInfo courseInfo =(CourseInfo)annotation;
System.out.println("课程名字:"+ courseInfo.courseName()+"\n"+
"课程标签:"+courseInfo.courseTag()+"\n"+
"课程序号:"+courseInfo.courseIndex()+"\n"+
"课程简介:"+ courseInfo.courseProfile());
}
}
@SneakyThrows
public static void parseFieldAnnotation(){
Class clazz = Class.forName("demo.annotation.CourseTest");
//解析属性上的注解
Field[] declaredFields = clazz.getDeclaredFields();
for (Field field : declaredFields){
//判断成员变量里是否有指定类型的注解
boolean annotationPresent = field.isAnnotationPresent(PersonInfo.class);
if(annotationPresent){
PersonInfo annotation = field.getAnnotation(PersonInfo.class);
System.out.println("姓名:"+annotation.name()+"\n"+
"年龄:"+annotation.age()+"\n"+
"性别:"+annotation.sex());
for (String language : annotation.landuage()){
System.out.println("语言:"+language);
}
}
}
}
public static void main(String[] args) {
parseTypeAnnotation();
parseFieldAnnotation();
}
}
4.总结:
通过反射获取注解的方法:@Retention(RetentionPolicy.RUNTIME)这里必须是运行状态,其他的就不能获取
//获取类上面
Annotation[] annotations = clazz.getAnnotations();
//获取属性上注解的内容
Field[] declaredFields = clazz.getDeclaredFields();
//获取方法上注解的内容
Method[] declaredMethods = clazz.getDeclaredMethods();