注解:

就是java代码里的特殊标记,比如@Override、@Test,作用是:让其它程序根据注解信息来决定怎么执行程序。

自定义注解:自己定义注解

Public @interface 注解名称{

Public  属性类型 属性名() default  默认值;

}

Value是特殊属性,可以不写明;如果有多个属性则要  指明value属性的值

注解的本质是一个接口  继承了Annotation接口

元注解 --- 注解的注解

@Target 声明注解只能在哪些位置上使用

@Retention()  注解的保留周期

source源码阶段  class阶段(默认)  Runtime(开发常用)

注解@Target和@Retention可以用来修饰注解,是注解的注解,称为元注解

自定义注解代码实现:

package my.day02;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.TYPE,ElementType.METHOD})//修饰注解作用范围为类上和方法上
@Retention(RetentionPolicy.RUNTIME)           //运行时也有效
public @interface MyTest4 {
    String value();
    double aaa() default 100.00;
    String[] bbb();

}

什么是注解的解析?

就是判断类上、方法上、成员变量上是否存在注解,并且把注解里面的内容解析出来。

指导思想:要解析谁上面的注解,就应该先拿到谁。

解析类上面的注解,则应该先获取到该类的类对象,在通过class对象解析上面的注解。

使用上述注解的类:

package my.day02;
@MyTest4(value = "10",bbb = {"百度","夸克","阿里"})
public class Demo {
    @MyTest4(value = "200",bbb = {"steam","和平精英","王者荣耀"})
    public void test() {

    }
}

对注解进行解析的测试类:

写了两个测试方法,分别对类上的注解和方法上的注解进行解析。

package my.day02;

import org.junit.jupiter.api.Test;

import java.lang.reflect.Method;
import java.util.Arrays;


public class AnnotationTest3 {
    @Test
    //解析类上注解的方法
    public void parseClass(){
        //1.先得到类对象
        Class<Demo> demoClass = Demo.class;
        //2.解析类上的注解
        //判断类上是否包含某个注解
        if (demoClass.isAnnotationPresent(MyTest4.class)){
            //强转成MyTest4  实际拿到的是注解类型
            MyTest4 myTest4 =
                    (MyTest4) demoClass.getDeclaredAnnotation(MyTest4.class);
            System.out.println(myTest4.value());
            System.out.println(myTest4.aaa());
            //拿到是一个数组,转成字符串
            System.out.println(Arrays.toString(myTest4.bbb()));
        }
    }
    @Test
    //解析方法上注解的方法
    public void parseMethod() throws NoSuchMethodException {
        //1.先得到类对象,再得到方法对象
        Class<Demo> demoClass = Demo.class;
        Method test = demoClass.getDeclaredMethod("test");
        //2.解析类上的注解
        //判断类上是否包含某个注解
        if (test.isAnnotationPresent(MyTest4.class)){
            //强转成MyTest4  实际拿到的是注解类型
            MyTest4 myTest4 =
                    (MyTest4) test.getDeclaredAnnotation(MyTest4.class);
            System.out.println(myTest4.value());
            System.out.println(myTest4.aaa());
            //拿到是一个数组,转成字符串
            System.out.println(Arrays.toString(myTest4.bbb()));
        }
    }
}

测试结果:

对类上的注解解析:

 对方法上的注解解析:

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部