0
点赞
收藏
分享

微信扫一扫

spring自定义注解

日月同辉9908 2022-02-20 阅读 45
注解

元注解:

@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();
举报

相关推荐

0 条评论