Javaは一般的なタイプのインスタンスを取得します。


Javaは一般的なタイプのインスタンスを取得します。
Java汎型は実際に多くの欠陥があります。例えば、汎型のタイプを直接取得できない、バンド汎型のクラスを取得できないなどです。
以下の方式は正しくないです。
①.汎型の種類を取得する

Class lstUClazz = List<User>.class
②局所変数の汎型のタイプを取得する

List<User> listUser = new ArrayList<User>();
Type genType = listUser.getClass().getClass().getGenericSuperclass();

Class templatClazz = null;

if(ParameterizedType.class.isInstance(genType)
{
  //     User ,            ,               
  ParameterizedType parameterizedType = (ParameterizedType) genType;
 templatClazz = (Class) parameterizedType.getActualTypeArguments()[0];
}

 

では、どうやって一般的なタイプを獲得できますか?
①.真実のタイプの存在が必要です。
②.汎型のタイプは明確である(List<User>は明確であり、List<T>は明確ではない)
以上の2点を満たすと、私たちは汎型のタイプを獲得できます。
1.継承方式により、タイプを明確にし、汎型クラスを取得する

public abstract class JdbcDaoSupport<T> {
   
  protected JdbcDaoSupport() {
    
  }
   public Class getTempalteType()
  {
     Class<T> clazz = (Class<T>) ((ParameterizedType) getClass()
        .getGenericSuperclass()).getActualTypeArguments()[0];
     return clazz;                    
  }
}

public class UserDao extends JdbcDaoSupport<User> {
}

public class Test{
    public static void main(String[] args)
    {
      UserDao dao = new UserDao();
      Class clazz = dao.getTemplateType();
      System.out.println(clazz.getName()); //   xxx.xxx.User
    }
}

2.クラス属性の一般タイプを取得する

public class Test extends ClassA<String> { 
  private List<String> list; 
  private Map<String, Object> map; 
 
  /*** 
   *   List     
   */ 
  public static void testList() throws NoSuchFieldException, SecurityException { 
    Type t = Test.class.getDeclaredField("list").getGenericType(); 
    if (ParameterizedType.class.isAssignableFrom(t.getClass())) { 
      for (Type t1 : ((ParameterizedType) t).getActualTypeArguments()) { 
        System.out.print(t1 + ","); 
      } 
      System.out.println(); 
    } 
  } 
 
  /*** 
   *   Map     
   */ 
  public static void testMap() throws NoSuchFieldException, SecurityException { 
    Type t = Test.class.getDeclaredField("map").getGenericType(); 
    if (ParameterizedType.class.isAssignableFrom(t.getClass())) { 
      for (Type t1 : ((ParameterizedType) t).getActualTypeArguments()) { 
        System.out.print(t1 + ","); 
      } 
      System.out.println(); 
    } 
  } 
 
  public static void main(String args[]) throws Exception { 
    System.out.println(">>>>>>>>>>>testList>>>>>>>>>>>"); 
    testList(); 
    System.out.println("<<<<<<<<<<<testList<<<<<<<<<<<
"); System.out.println(">>>>>>>>>>>testMap>>>>>>>>>>>"); testMap(); System.out.println("<<<<<<<<<<<testMap<<<<<<<<<<<
"); System.out.println(">>>>>>>>>>>testClassA>>>>>>>>>>>"); new Test().testClassA(); System.out.println("<<<<<<<<<<<testClassA<<<<<<<<<<<"); } }
3.局所変数の汎型を取得するタイプ

List<User> lst = new ArrayList<User>(){};
Type genType = listUser.getClass().getClass().getGenericSuperclass();

Class templatClazz = null;

if(ParameterizedType.class.isInstance(genType)
{
  ParameterizedType parameterizedType = (ParameterizedType) genType;
 templatClazz = (Class) parameterizedType.getActualTypeArguments()[0];
}

 実際には、汎型のタイプが実際には「継承」されていることがわかった。もちろんこれらのテクニックを上手に使えば、オープンソースのGsonのType Tokenは上記のテクニックを利用して、jsonと複雑なタイプの切り替えができます。
 多くの場合、クラスはパラメータとして使われていますが、私たちは実際には一般的なクラスをパラメータとして導入することができます。
私たちは普通便利のために、特定のクラスを定義しないので、次のような方法を使う必要があります。

Class clz = new ArrayList<User>(){}.getClass();

class JsonToObjectUtil {

 public static <T> T jsonToObject(Class<T> clz,List<String> jsonList){
 
 Type genType = clz.getClass().getGenericSuperclass();
 Class templatClazz = null;
 
 if(ParameterizedType.class.isInstance(genType));
 {
  ParameterizedType parameterizedType = (ParameterizedType) genType;
  templatClazz = (Class) parameterizedType.getActualTypeArguments()[0];
 }
 List<Object> lst = new ArrayList<Object>();
 /*****/
 if(templatClazz!=null && jsonList!=null)
 {
  for (String str : jsonList) {
  
  Gson gson = new Gson();
  Object fromJson = gson.fromJson(str, templatClazz);
  lst.add(fromJson);
  }
  
 }
 /*****/
 return (T) lst;
 }
 
 public static void main(String[] args) {
 
 List<String> jsonList = null;
 //       jsonList   
 
 Class superClazz = new ArrayList<User>(){}.getClass();
 List jsonToObject = JsonToObjectUtil.jsonToObject(superClazz, jsonList);
 
 }
 
}

読んでくれてありがとうございます。みなさんのご協力をお願いします。ありがとうございます。