1、前言
- 我们会使用注解注释一个类的成分,那么就涉及到要解析出这些注解的数据。
- 开发中经常要知道一个类的成分上面到底有哪些注解,注解有哪些属性,这都需要进行注解的解析。
2、注解解析相关的接口
1、Annotation:注解类型,该类是所有注解的父类,注解都是一个Annotation对象。
2、AnnotatedElement:该接口定义了与注解解析相关的方法。所有的类成分Class、Method、Field、Constructor:都实现了AnnotatedElement接口,他们都拥有解析注解的能力。
Annotation[] getDeclaredAnnotations
获得当前对象上使用的所有注解,返回注解数组。T getDeclaredAnnotation(Class<T> annotationClass)
根据注解类型获得对应注解对象。boolean isAnnotationPresent(Class<T> annotationClass)
判断当前对象是否使用了指定的注解,如果使用了则返回true,否则,返回false。
3、解析注解数据的原理
- 注解在哪个成分上,我们就先拿哪个成分对象。
- 比如注解作用成员方法,就要获得该成员方法对应的Method对象,再来拿上面的注解。
- 比如注解作用在类上,则获取该类的Class对象,再来拿上面的注解。
- 比如注解作用在成员变量上,则要获得该成员变量对应的Field对象,再来拿上面的注解。
4、案例
1、定义注解Book,要求如下:
- 包含属性:String value() 书名
- 包含属性:double price() 价格
- 包含属性:String[] authors() 作者
- 限制注解使用的位置:类和成员方法上
- 限制注解的有效范围:RUNTIME
2、定义BookStore类,在类和成员方法run()上面使用Book注解
3、定义AnnotationTest测试类,获取Book注解上的数据
5、案例实现代码
package com.zjl.study.注解.注解的解析;
import org.junit.Test;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.Method;
import java.util.Arrays;
/**
* Created by zjl 2022/6/21
**/
public class AnnotationTest {
@Test
public void parseClass() {
// 1、定位Class类对象
Class bookStoreClass = BookStore.class;
// 2、判断这个类上是否使用了某个注解
if (bookStoreClass.isAnnotationPresent(Book.class)) {
// 3、获取这个注解对象
Book book = (Book) bookStoreClass.getDeclaredAnnotation(Book.class);
System.out.println(book.value());
System.out.println(book.price());
System.out.println(Arrays.toString(book.authors()));
}
}
@Test
public void parseMethod() throws Exception {
// 1、定位Class类对象
Class bookStoreClass = BookStore.class;
// 2、定位方法对象
Method runMethod = bookStoreClass.getDeclaredMethod("run");
// 2、判断这个方法上是否使用了某个注解
if (runMethod.isAnnotationPresent(Book.class)) {
// 3、获取这个注解对象
Book book = (Book) runMethod.getDeclaredAnnotation(Book.class);
System.out.println(book.value());
System.out.println(book.price());
System.out.println(Arrays.toString(book.authors()));
}
}
}
@Book(value = "《JAVA基础到精通》", price = 99.9, authors = { "张三", "李四" })
class BookStore {
@Book(value = "《Mybatis持久层框架》", price = 199.5, authors = { "王五" })
public void run() {
}
}
@Target({ ElementType.TYPE, ElementType.METHOD }) // 类和成员方法上使用
@Retention(RetentionPolicy.RUNTIME)
@interface Book {
String value();
double price() default 100;
String[] authors();
}
6、运行结果
1、运行parseClass单元测试结果

2、运行parseMethod单元测试结果

本文详细介绍了Java注解的解析过程,包括注解解析相关的接口,如Annotation和AnnotatedElement,以及如何通过这些接口获取注解数据。通过一个具体的案例,展示了如何定义注解Book,用在BookStore类和run方法上,并在AnnotationTest测试类中解析Book注解上的数据。
1235

被折叠的 条评论
为什么被折叠?



