Maison  >  Article  >  Java  >  Conseils pour obtenir des informations génériques au printemps

Conseils pour obtenir des informations génériques au printemps

不言
不言avant
2019-03-27 10:24:322731parcourir

Le contenu de cet article concerne les techniques et méthodes pour obtenir des informations génériques au printemps. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer.

Introduction : le code source de Spring est un grand trésor. La plupart des outils que nous pouvons rencontrer se trouvent dans le code source. Par conséquent, le mica open source de l'auteur est entièrement basé sur Spring pour les améliorations de base et ne le fait pas. réinventer la roue. Ce que je veux partager aujourd'hui, c'est comment obtenir des génériques avec élégance au printemps.

Obtenez des génériques

Analysez-le vous-même

Notre méthode de traitement précédente, le code source vjtools (Jiangnan Baiyi).

/**
 * 通过反射, 获得Class定义中声明的父类的泛型参数的类型.
 * 
 * 注意泛型必须定义在父类处. 这是唯一可以通过反射从泛型获得Class实例的地方.
 * 
 * 如无法找到, 返回Object.class.
 * 
 * 如public UserDao extends HibernateDao<User,Long>
 * 
 * @param clazz clazz The class to introspect
 * @param index the Index of the generic declaration, start from 0.
 * @return the index generic declaration, or Object.class if cannot be determined
 */
public static Class getClassGenericType(final Class clazz, final int index) {

    Type genType = clazz.getGenericSuperclass();

    if (!(genType instanceof ParameterizedType)) {
        logger.warn(clazz.getSimpleName() + "'s superclass not ParameterizedType");
        return Object.class;
    }

    Type[] params = ((ParameterizedType) genType).getActualTypeArguments();

    if ((index >= params.length) || (index < 0)) {
        logger.warn("Index: " + index + ", Size of " + clazz.getSimpleName() + "&#39;s Parameterized Type: "
                + params.length);
        return Object.class;
    }
    if (!(params[index] instanceof Class)) {
        logger.warn(clazz.getSimpleName() + " not set the actual class on superclass generic parameter");
        return Object.class;
    }

    return (Class) params[index];
}

Outil ResolvableType

À partir de Spring 4.0, l'outil ResolvableType a été ajouté à Spring. Cette classe peut être utilisée pour renvoyer des informations génériques plus facilement.
Tout d'abord, jetons un œil à l'exemple officiel :

private HashMap<Integer, List<String>> myMap;

public void example() {
    ResolvableType t = ResolvableType.forField(getClass().getDeclaredField("myMap"));
    t.getSuperType(); // AbstractMap<Integer, List<String>>
    t.asMap(); // Map<Integer, List<String>>
    t.getGeneric(0).resolve(); // Integer
    t.getGeneric(1).resolve(); // List
    t.getGeneric(1); // List<String>
    t.resolveGeneric(1, 0); // String
}

Description détaillée

Construction pour obtenir les informations génériques de Field

ResolvableType.forField(Field)

Construction à obtenir les informations génériques des informations sur la méthode

ResolvableType.forMethodParameter(Method, int)

La méthode Construction Get renvoie des informations génériques sur les paramètres

ResolvableType.forMethodReturnType(Method)

La construction obtient les informations génériques sur les paramètres de construction

ResolvableType.forConstructorParameter(Constructor, int)

Construction obtient les informations génériques de la classe Informations de type

ResolvableType.forClass(Class)

Construction pour obtenir les informations génériques du type

ResolvableType.forType(Type)

Construction pour obtenir les informations génériques de l'instance

ResolvableType.forInstance(Object)

Pour plus d'informations sur l'utilisation de l'API, veuillez consulter la documentation Java de ResolvableType : https://docs.spring.io/spring...

Cet article est terminé ici. Pour d'autres contenus passionnants, vous pouvez. faites attention à Java sur le site Web PHP chinois Tutoriel vidéo colonne !

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer