目錄
前言
在了解了自定義注解的入門知識后,以實踐的形式,介紹一下通過反射技術獲取自定義注解的常用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,請在文章下方留你下的神評妙論!