package com.ibeetl.admin.core.util;

import org.springframework.core.annotation.AnnotationUtils;

import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * 描述: 获取注解的值
 *
 * @author : xiandafu
 */
public class AnnotationUtil {

  private AnnotationUtil() {}

  public static AnnotationUtil getInstance() {
    return AnnotationUtilHolder.instance;
  }

  /**
   * 获取一个类注解的名称和值
   *
   * @param annotationClasss 注解定义类
   * @param useAnnotationClass 使用注解的类
   * @return List<Map<String, Object>>
   * @throws Exception
   */
  public List<Map<String, Object>> getAnnotations(
      Class annotationClasss, Class useAnnotationClass) {
    List<Map<String, Object>> annotationMapList = new ArrayList<>();

    Field[] fields = useAnnotationClass.getDeclaredFields();
    for (Field field : fields) {
      if (field.isAnnotationPresent(annotationClasss)) {
        Annotation p = field.getAnnotation(annotationClasss);
        Map map = AnnotationUtils.getAnnotationAttributes(p);
        map.put("fieldName", field.getName());
        annotationMapList.add(map);
      }
    }

    return annotationMapList;
  }

  private static class AnnotationUtilHolder {
    private static AnnotationUtil instance = new AnnotationUtil();

    private AnnotationUtilHolder() {}
  }
}
