자바 가 일반적인 형식 인 스 턴 스 를 가 져 옵 니 다.

5946 단어
자바 가 일반적인 형식 인 스 턴 스 를 가 져 옵 니 다.
자바 범 형 은 실제 적 으로 많은 결함 이 있 습 니 다. 예 를 들 어 범 형의 유형 을 직접 가 져 올 수 없고 범 형 류 를 가 져 올 수 없습니다.
다음 방식 은 정확 하지 않다.
①. 일반적인 유형 가 져 오기

Class lstUClazz = List.class

② 부분 변수 범 형의 유형 가 져 오기

List listUser = new ArrayList();
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 는 명확 하고 List 는 명확 하지 않다)
상기 두 가 지 를 만족 시 키 면 우 리 는 일반적인 유형 을 얻 을 수 있다.
1. 상속 방식 을 통 해 유형 을 명 확 히 한 다음 에 범 형 류 를 얻는다.

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

public class UserDao extends JdbcDaoSupport {
}

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 { 
  private List list; 
  private Map 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("<<<<<<<<<<>>>>>>>>>>testMap>>>>>>>>>>>"); 
    testMap(); 
    System.out.println("<<<<<<<<<<>>>>>>>>>>testClassA>>>>>>>>>>>"); 
    new Test().testClassA(); 
    System.out.println("<<<<<<<<<< 
 

3. 부분 변수의 일반적인 유형 가 져 오기

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

Class templatClazz = null;

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


 실제로 우 리 는 범 형 을 얻 을 수 있 는 유형 이 사실상 '계승' 을 한 다 는 것 을 발견 했다.물론 상기 기 교 를 능숙 하 게 활용 할 수 있다 면 많은 일 을 할 수 있다. 예 를 들 어 오픈 소스 프로젝트 인 Gson 중의 TypeToken 은 상기 기 교 를 이용 하여 json 과 복잡 한 유형의 전환 을 실현 하 는 것 이다.
 많은 경우 에 Class 는 매개 변수 로 사용 되 는데 우 리 는 팬 형 클래스 를 매개 변수 로 전송 할 수 있 습 니 다.
우 리 는 일반적으로 편 의 를 위해 특정한 종 류 를 정의 하지 않 기 때문에 다음 과 같은 방식 을 사용 해 야 한다.

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

예시

class JsonToObjectUtil {

 public static  T jsonToObject(Class clz,List jsonList){
 
 Type genType = clz.getClass().getGenericSuperclass();
 Class templatClazz = null;
 
 if(ParameterizedType.class.isInstance(genType));
 {
  ParameterizedType parameterizedType = (ParameterizedType) genType;
  templatClazz = (Class) parameterizedType.getActualTypeArguments()[0];
 }
 List lst = new ArrayList();
 /*****/
 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 jsonList = null;
 //       jsonList   
 
 Class superClazz = new ArrayList(){}.getClass();
 List jsonToObject = JsonToObjectUtil.jsonToObject(superClazz, jsonList);
 
 }
 
}


읽 어 주 셔 서 감사합니다. 여러분 에 게 도움 이 되 기 를 바 랍 니 다. 본 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기