ジェネリック型を取得するためにJavaのリフレクション

このリンク:https://blog.csdn.net/hongxingxiaonan/article/details/49202613
           

 クラスのメンバを取得するために、アプリケーションのJavaリフレクション技術、方法、およびコンストラクタは比較的容易であるが、比較的困難を有してジェネリック型を達成するためです。簡単な例を見て、各ステップの役割が詳細に記載されています。
クラスデモ{パブリック
プライベートリスト<整数>のList1、
プライベートリスト<セット<整数>> ListSet;
公共の設定<文字列> FUN1(地図<整数、文字列>マップ){リターンNULL;}

公共の静的な無効getFieldGenericType(){
試み{
clazz = Demo.classクラス、
フィールド、フィールドclazz.getDeclaredField =( "リスト1");
タイプtype = Field.getGenericType(); //タイプフィールドを取得
ParameterizedTypeImplは、ParameterizedType =(ParameterizedTypeImpl)タイプ; //は強い特定の実装に回しますクラス
タイプ[] genericTypes = parameterizedType.getActualTypeArguments() ; // 含むジェネリックタイプの取得
のSystem.out.println(genericTypes [0]);
}キャッチ(持たないNoSuchFieldException E){
E.
}
}

パブリック静的な無効メイン(文字列[] args){

getFieldGenericTypeは();
}
}
        上記のコードは正しくジェネリック型整数デモクラスのメンバーLIST1プリントアウト。getGenericType型タイプ()メソッドによってコードを得るための最初のステップ。またParameterizedTypeImplすることができ、これは実際にはリスト<Interger>、タイプの実装クラスをすることができ、クラスを表す入力します。フィールドタイプは、(getGenericTypeを通じてジェネリックであれば)それは通常のクラスに取り込まれた場合、ParameterizedTypeImplに取られているクラスです。我々は上記の方法でジェネリック型を得るように、我々は、リスト<Interger>、コンパイラにはない取得のgetTypeリストフィールドによる情報取得方法があるだけで、一般的なクラスの情報はありません。最初のParameterizedTypeImplタイプになって、強力な二段階を入力し、ここでの開発中に書いていない、実装クラスの特定のタイプを決定するための本当のタイプが存在しないことを知って、怠惰を盗んだ、すべてのパンにParameterizedTypeImpl GETから4番目のステップタイプを入力します。ParameterizedTypeImplパラメータ化された型、我々は同等のパラメータの種類を取得したいジェネリック型である、いくつかの一般的なタイプがあり、getActualTypeArgumentsは()型パラメータの数を返します。
        タイプは、ちょうどクラスはサブクラスであり、そしてそれらに無限ループに陥っているかのよう()getActualTypeArgumentsにより取得は、Type配列であると述べました。はい、実際のコードでは、実際の上に、例えば、第2のフィールドlistSetコードを入れ子になったジェネリック型が存在します。ただ、ネストされたジェネリック医薬品の入手方法何層に基づくでも解析することができます。ListSet汎用コード情報を解析として、以下である:
パブリック静的ボイドgetFieldGenericType1(){
試み{
クラスclazz = Demo.class、
フィールド、フィールドclazz.getDeclaredField =( "ListSet");
タイプtype = Field.getGenericType(); //得ますフィールドタイプ
ParameterizedTypeImplは、ParameterizedType =(ParameterizedTypeImpl)タイプ; //が強い特定のカテゴリに変わる
タイプ[] genericTypes = parameterizedType.getActualTypeArguments() ; // 取得含むジェネリック型

ParameterizedTypeImplはsetType =(ParameterizedTypeImpl)genericTypesを[ 0]。 代表再び//セット<整数>強いタイプParameterizedTypeImplに変換される
タイプ[] = setTypeArguments setType.getActualTypeArguments()。
System.out.println(setTypeArguments [0])。
}キャッチ(持たないNoSuchFieldException電子){
e.printStackTrace();
}
}
         同样的道理、获取方法中的泛型信息也不在话下
パブリック静的ボイドgetMethodGenericType(){
試み{
クラスclazz = Demo.class。
方法メソッド= clazz.getMethod( "FUN1"、Map.class)。
型タイプ= method.getGenericReturnType()。
ParameterizedTypeImplは、ParameterizedType =(ParameterizedTypeImpl)タイプ。
タイプ[] genericTypes = parameterizedType.getActualTypeArguments()。
System.out.println([0] + genericTypes "ジェネリック型を返します")。

タイプmapTypeは= method.getGenericParameterTypes()[0];
ParameterizedTypeImpl mapParamType =(ParameterizedTypeImpl)mapTypeは; // 再設定<整数>強いタイプParameterizedTypeImplに変換される表現
型[] = mapArgs mapParamType.getActualTypeArguments();
のSystem.out.println( "ジェネリックメソッド最初型PARAM" + mapArgs [ 0]);
}キャッチ(例外e){
e.printStackTrace();
}
}
        上記の部材および方法を解析する一般的な情報の方法を示しているが、通常の変数のための彼の一般的な実行時の情報を解析することができそれは?その答えは、彼は我々が唯一取得することができ、通常の変数のクラス情報だから、何もありませんが、またちょうどクラスは、一般的な情報ではないと言われて。あなたは一般的な情報を取得したい場合は、まずParameterizedTypeImpl缶に取得する必要があります。
----------------
免責事項:この記事は元の記事CSDNブロガー「hongxingxiaonan」で、CC 4.0 BY-SAの著作権契約書に従ってください、複製、元のソースのリンクと、この文を添付してください。 。
オリジナルリンクします。https://blog.csdn.net/hongxingxiaonan/article/details/49202613

おすすめ

転載: www.cnblogs.com/kelelipeng/p/11949512.html