Java 注解

自定义注解

1
2
3
4
5
6
修饰符 @interface 注解名{
//注解属性
数据类型 属性名()

数据类型 属性名() default 默认值
}
1
2
3
4
5
6
7
8
元注解@Target @Retention
用来注解自定义注解 是用在自定义注解的注解
@Target 约束自定义注解只能在哪些地方使用
TYPE...
@Retention 申明注解的生命周期
SOURCE 只作用在源码阶段
CLASS(默认) 字节码文件,执行就没了
RUNTIME 一直存在
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@interface Book {

String name();

double price();

String madeBy() default "paper";

}

@Book(name = "hhh", price = 123)
class parseTest{

@Book(name = "method", price = 334)
private void test(){
System.out.println("test");
}
}
1
2
3
4
5
6
7
8
9
10
Annotation 是所有注解的父类
AnnotatedElement 定义了与注解解析相关的方法
所有Class、Method、。。。都实现了AnnotatedElement接口
都拥有解析注解的能力
1、Annotation[] getDeclaredAnnotations()
获得当前对象上使用的所有注解
2、T getDeclaredAnnotation(Class<T> annotationClass)
根据注解类型获得对应的注解对象
3、boolean isAnnotationPresent(Class<Annotation> annotationClass)
判断当前对象是否使用了指定的注解,使用了返回true
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@Test
public void test() throws NoSuchMethodException {
//通过反射拿
Class parseTestClass = parseTest.class;
//判断这个类上是否使用了某个注解
if (parseTestClass.isAnnotationPresent(Book.class)){
//获取注解对象
Book book = (Book) parseTestClass.getDeclaredAnnotation(Book.class);
//拿值
System.out.println(book.name());
}

//通过类拿到方法对象
Method test = parseTestClass.getDeclaredMethod("test");
//判断
if (test.isAnnotationPresent(Book.class)){
Book b = test.getDeclaredAnnotation(Book.class);

System.out.println(b.name());
}
}

https://juejin.cn/post/6844904167517995022

https://juejin.cn/post/6844904168491073543