注解:
就是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()));
}
}
}
测试结果:
对类上的注解解析:
对方法上的注解解析: