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() + "'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!