前言
在了解了自定义注解的入门知识后,以实践的形式,介绍一下通过反射技术获取自定义注解的常用API,例如如何获取自定义注解的成员变量值等等。
由反射获取自定义注解
为了获得自定义注解信息,本节要用到Java中的灵魂技术——反射!常用API:
// 获取指定类型的注解
public <A extends Annotation> A getAnnotation(Class<A> annotationClass);
// 获取所有注解(包括父类中被Inherited修饰的注解)
public Annotation[] getAnnotations();
// 获取声明的注解(但是不包括父类中被Inherited修饰的注解)
public Annotation[] getDeclaredAnnotations();
// 判断对象上是否被某个注解标注
public boolean isAnnotationPresent(Class<? extends Annotation> annotationClass)
// 获取某个类声明的所有字段
public Field[] getDeclaredFields() throws SecurityException;
定义一个矩形画图工具类,使用《Spring注解之自定义注解入门》中的注解ShapeAn进行标注:
package com.eg.wiener.service.impl;
import com.eg.wiener.config.ShapeAn;
import com.eg.wiener.service.Shape;
import org.springframework.stereotype.Service;
/**
* 矩形
*
* @author Wiener
* @date 2021/1/30
*/
@ShapeAn(value = "rectangleAn", beanName = "矩形画图工具")
@Service
public class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("Inside Rectangle::draw() method.");
}
}
创建测试类,使用反射技术获取注解类:
package com.eg.wiener.controller;
import com.eg.wiener.config.ShapeAn;
import java.lang.reflect.Method;
public class ShapeController {
public static void main(String[] args) {
try {
//获取Class对象
Class rectangleClazz = Class.forName("com.eg.wiener.service.impl.Rectangle");
//获取Class对象rectangleClazz所使用的自定义注解 ShapeAn
if (rectangleClazz.isAnnotationPresent(ShapeAn.class)) {
System.out.println("类上使用了ShapeAn注解");
}
ShapeAn shapeAn = (ShapeAn) rectangleClazz.getAnnotation(ShapeAn.class);
// 打印注解属性
System.out.println(shapeAn.beanName());
System.out.println(shapeAn.value());
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
注解在定义好了以后,使用的时候操作注解类型元素像在操作属性,解析的时候操作像在操作方法,是不是很爽?执行上述测试函数,控制台输出结果:
类上使用了ShapeAn注解
矩形画图工具
rectangleAn
我们虽然为value属性设置了默认值,但是,在使用ShapeAn的时候,由于进行了赋值,因此,这里打印了设定的结果rectangleAn。
结束语
老铁们,因楼兰胡杨能力有限,文中难免出现瑕疵,如果发现bug或者有更好的idea,请在文章下方留你下的神评妙论!