zoukankan      html  css  js  c++  java
  • 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,请在文章下方留你下的神评妙论!


      读后有收获,小礼物走一走,请作者喝咖啡。

    赞赏支持

  • 相关阅读:
    python3.x 基础五:模块
    python3.x 基础四:目录获取及目录规范
    python3.x 基础四:json与pickple
    python3.x 基础四:生成器与迭代器
    python3.x 基础三:装饰器
    python3.x 基础三:函数
    [leetcode]Anagrams
    [leetcode]Text Justification
    [leetcode]Single Number
    [leetcode]Longest Palindromic Substring
  • 原文地址:https://www.cnblogs.com/east7/p/14350014.html
Copyright © 2011-2022 走看看