注解继承 - 递归识别注解

习惯了继承的写法,总对注解的不可继承抱有遗憾,网上查资料,就那一个贴子,被无数的转载,也终没搞明白写的是什么意思。

无耐只能写个递归来取一下,如果有更好的办法,还请指教。

代码可稍加优化,取到即返回,目前是取出所有,然后再找。

package org.tzl.framework.common.utils;

import java.lang.annotation.Annotation;
import java.util.*;

/*******************************************************
 * 注解操作类
 *
 * author: tzl
 * tiem: 2021-12-26 21:04:22
 * *****************************************************/
public class AnnotationUtil {

    //=================================================================================================
    // 公有函数区
    //=================================================================================================
    
    /**
     * 递归获取符合条件的注解
     *
     * @param object          数据对象
     * @param annotationClass 注解类对象
     * @return 注解对象
     */
    public static Annotation recursiveGetAnnotation(Object object, Class<?> annotationClass) {
        return recursiveGetAnnotation(object.getClass(), annotationClass);
    }

    /**
     * 递归获取符合条件的注解
     *
     * @param clazz           类对象
     * @param annotationClass 注解类对象
     * @return 注解对象
     */
    public static Annotation recursiveGetAnnotation(Class<?> clazz, Class<?> annotationClass) {
        Map<Class<?>, Annotation> annotationMap = new HashMap<Class<?>, Annotation>();
        recursiveSetAnnotation(clazz, annotationMap);
        if (annotationMap.containsKey(annotationClass)) return annotationMap.get(annotationClass);
        return null;
    }

    //=================================================================================================
    // 私有函数区
    //=================================================================================================

    /**
     * 递归获取所有注解
     *
     * @param clazz         类对象
     * @param annotationMap 注解存储Map
     * @return 注解集合
     */
    private static void recursiveSetAnnotation(Class<?> clazz, Map<Class<?>, Annotation> annotationMap) {
        // 获取当前类对象的注解
        Annotation[] clazzAnnotations = clazz.getAnnotations();
        if (clazzAnnotations != null && clazzAnnotations.length > 0) {
            for (Annotation clazzAnnotation : clazzAnnotations) {
                if (annotationMap.containsKey(clazzAnnotation.annotationType())) continue;
                annotationMap.put(clazzAnnotation.annotationType(), clazzAnnotation);
                // 获取下一级注解
                recursiveSetAnnotation(clazzAnnotation.annotationType(), annotationMap);
            }
        }
    }
}

 

上一篇:嵌入式轻量级数据库 SQLite和 System.Data.SQLite


下一篇:leetcode完全背包-518.零钱兑换II