All Downloads are FREE. Search and download functionalities are using the official Maven repository.

cn.enilu.flash.core.lang.Reflects Maven / Gradle / Ivy

package cn.enilu.flash.core.lang;

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

/**
 * 反射工具类
 *
 * @author enilu([email protected])
 *
 */
public final class Reflects {
    public static class ClassAnnotation {
        private final Class klass;
        private final A annotation;

        public ClassAnnotation(Class klass, A annotation) {
            this.klass = klass;
            this.annotation = annotation;
        }

        public Class getKlass() {
            return klass;
        }

        public A getAnnotation() {
            return annotation;
        }
    }

    private Reflects() {
    }

    /**
     * 获取类型中的所有属性信息
     * @param klass
     * @param recursive 是否获取父类属性信息
     * @return
     */
    public static List getFields(Class klass, boolean recursive) {
        return getFields(klass, null, recursive);
    }

    public static List getFields(Class klass, Class annotationClass, boolean recursive) {
        Map fields = new LinkedHashMap<>();

        ArrayList> classList = Lists.newArrayList();
        classList.add(klass);
        if (recursive) {
            Class current = klass.getSuperclass();
            while (current != null) {
                classList.add(current);
                current = current.getSuperclass();
            }
        }

        for (int i = classList.size() - 1; i >= 0; i--) {
            Class current = classList.get(i);

            for (Field field : current.getDeclaredFields()) {
                if (annotationClass == null) {
                    fields.put(field.getName(), field);
                    continue;
                }

                if (field.getAnnotation(annotationClass) != null) {
                    fields.put(field.getName(), field);
                }
            }
        }

        return new ArrayList<>(fields.values());
    }

    public static boolean isAnnotationPresent(Class klass,
                                              Class annotationClass) {
        Class current = klass;
        while (current != null) {
            if (current.isAnnotationPresent(annotationClass)) {
                return true;
            }
            current = current.getSuperclass();
        }

        return false;
    }

    /**
     * 获取指定类型的注解信息
     * @param klass
     * @param annotationClass
     * @param 
     * @return
     */
    public static  ClassAnnotation getAnnotation(
            Class klass, Class annotationClass) {
        Class current = klass;
        while (current != null) {
            if (current.isAnnotationPresent(annotationClass)) {
                A annotation = current.getAnnotation(annotationClass);
                return new ClassAnnotation(current, annotation);
            }
            current = current.getSuperclass();
        }

        return null;
    }

    /**
     * 获取指定名称的属性信息
     * @param cc
     * @param name
     * @return
     */
    public static  Field getField(Class cc,String name) {
        while (null != cc && cc != Object.class) {
            try {
                return cc.getDeclaredField(name);
            }
            catch (NoSuchFieldException e) {
                cc = cc.getSuperclass();
            }
        }
      return null;
    }

    /**
     * 获取集合属性中的参数类型,集合必须声明为范型
     * @param field  集合属性
     * @return 参数类型
     */
    public static Class getParameterizedType(Field field){
        Type type = field.getGenericType();
        if(type==null){
            return null;
        }
        if(type instanceof ParameterizedType){
            ParameterizedType pt = (ParameterizedType) type;
            Class genericClazz = (Class)pt.getActualTypeArguments()[0];
            return genericClazz;
        }
        return null;

    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy