ResolvableType 4.0+

Spring 4.0 μ΄μƒμ—μ„œ μ§€μ›ν•˜λ©° Java 의 λ³΅μž‘ν•œ λ¦¬ν”Œλ ‰μ…˜μ„ ν†΅ν•œ Type 접근을 μ†μ‰½κ²Œ μ‚¬μš©ν•˜λ„λ‘ λž˜ν•‘ν•œ ν΄λž˜μŠ€μ΄λ‹€.

class TypeReference<T> {
  Type type;
  public TypeReference() {
    Type sType = getClass().getGenericSuperclass();

    if (sType instanceof ParameterizedType) {
      this.type = ((ParameterizedType) sType).getActualTypeArguments()[0];
    } else throw new RuntimeException();
  }
}

public static void main(String[] args) throws Exception {
  // ResolvableType rt = ResolvableType.forClass(TypeReference.class);
  ResolvableType rt = ResolvableType.forInstance(new TypeReference<List<String>>() {});

  // java.util.List<java.lang.String>
  System.out.println(rt.getSuperType().getGeneric(0).getType());

  // com.wemakeprice.epes.utils.PropertyUtilsTest.com.wemakeprice.epes.utils.PropertyUtilsTest$TypeReference<java.util.List<java.lang.String>>
  System.out.println(rt.getSuperType().getNested(0).getType());

  // com.wemakeprice.epes.utils.PropertyUtilsTest.com.wemakeprice.epes.utils.PropertyUtilsTest$TypeReference<java.util.List<java.lang.String>>
  System.out.println(rt.getSuperType().getNested(1).getType());

  // java.util.List<java.lang.String>
  System.out.println(rt.getSuperType().getNested(2).getType());

  // false
  System.out.println(rt.getSuperType().hasUnresolvableGenerics());
  
  // true
  System.out.println(ResolvableType.forInstance(new ArrayList<String>()).hasUnresolvableGenerics());
}