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,请在文章下方留你下的神评妙论!

posted @ 2021-01-30 18:44  楼兰胡杨  阅读(2101)  评论(0编辑  收藏  举报