Spring注解之獲取自定義注解信息


前言

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM