Springでの優雅な汎用情報の取得


概要
Springソースは大きな宝庫で、私たちが出会うことができるほとんどのツールはソースコードの中で見つけることができるので、筆者がオープンソースのmicaはSpringに基づいて基礎の強化を行い、車輪を繰り返しません.今日私が分かち合うのはSpringで優雅に汎用型を手に入れることです.
汎用の取得
自己解析
私たちの前の処理方法は、コードソースvjtools(江南白衣)です.
/**
 *     ,   Class                .
 * 
 *             .                Class     .
 * 
 *      ,   Object.class.
 * 
 *  public UserDao extends HibernateDao
 * 
 * @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];
}

ResolvableTypeツール
Spring 4.0からSpringにResolvableTypeツールが追加され、このクラスは汎用情報を返すのに便利です.まず、公式の例を見てみましょう.
private HashMap> myMap;

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

詳細な説明
Fieldを取得する汎用情報の構築
ResolvableType.forField(Field)

Methodを取得する汎用情報の構築
ResolvableType.forMethodParameter(Method, int)

取得メソッドがパラメータを返す汎用情報を構築する
ResolvableType.forMethodReturnType(Method)

構築構築構築パラメータの汎用情報
ResolvableType.forConstructorParameter(Constructor, int)

取得クラスの汎用情報の構築
ResolvableType.forClass(Class)

取得タイプの汎用情報の構築
ResolvableType.forType(Type)

インスタンスを取得する汎用情報の構築
ResolvableType.forInstance(Object)

Apiの詳細については、ResolvableType java docを参照してください.https://docs.spring.io/spring...
オープンソース推奨
  • Spring bootマイクロサービス高効率開発micaツールセット:https://gitee.com/596392912/mica
  • Avue vueベースで構成可能な不思議なフレームワーク:https://gitee.com/smallweigit/avue
  • pig宇宙最強マイクロサービス(アーキテクチャ必須):https://gitee.com/log4j/pig
  • SpringBlade完全なオンラインソリューション(エンタープライズ開発必須):https://gitee.com/smallc/SpringBlade
  • IJPay支払いSDKは支払いを手に入れることができる.https://gitee.com/javen205/IJPay
  • 加入【如梦技术】Spring QQ群:479710041,了解更多.
  • 私たちに注目
    上のQRコードをスキャンして、もっとすばらしい内容は毎日お勧めします!