(시청일 : 20171001)


https://www.youtube.com/watch?v=y_uGSqpE4So : 2회에서 설명했던 수퍼 타입 토큰의 예제를 좀 더 효율적으로 개선하는 방법과 스프링이 제공하는 ResolvableType 사용법을 간단히 설명합니다.


■ Super Type Token (2회로 부터 개선된 버전)
 
public class SuperTypeToken {
    static Class TypeSafeMap {
        Map<Type, Object> map = new HashMap<>();
    <T> void put(TypeReference<T> tr, T value) {
        map.put(tr.type, value);
    }
    <T> T get(TypeReference<T> tr) {
        if (tr.type instanceof Class<?>)
            return ((Class<T>)tr.type).cast(map.get(tr.type));
        else
            return ((Class<T>)((ParameterizedType)tr.type).getRawType()).cast(map.get(tr.type)); // TR<List<String>>
    }
}
    static 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 {
        TypeReference m = new TypeSafeMap();
        m.put(new TypeReference<Integer>() {}, 1);
        m.put(new TypeReference<String>() {}, "String");
        m.put(new TypeReference<List<Integer>>() {}, Arrays.asList(1,2,3)); // List<Integer>
        m.put(new TypeReference<List<String>>() {}, Arrays.asList("a","b","c")); // List<String>
        m.put(new TypeReference<List<List<String>>>() {}, Arrays.asList(Arrays.asList("a","b"),Arrays.asList("c","d"),Arrays.asList("e"))); // List<String>

        System.out.println(m.get(new TypeReference<Integer>() {})); // 1
        System.out.println(m.get(new TypeReference<String>() {})); // String
        System.out.println(m.get(new TypeReference<List<Integer>>() {})); // [1, 2, 3]
        System.out.println(m.get(new TypeReference<List<String>>() {})); // [a, b, c]
        System.out.println(m.get(new TypeReference<List<List<String>>>() {})); // [[a, b], [c, d], [e]]

        Map<String, String> map = new HashMap<>();
        map.put("key1", "value1");
        map.put("key2", "value2");
        m.put(new TypeReference<Map<String, Stirng>>(), map);  // {key1=value1, key2=value2}
    }
}



■ 스프링 4.0버전 이상에서 지원하는 ResolvableType 예제 코드

public class SuperTypeToken {
    static 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>>() {});
        
        System.out.println(rt.getSuperType().getGenerics(0).getType()); // java.Util.List<java.lang.String>
        System.out.println(rt.getSuperType().getGenerics(0).getNested(2).getType()); // class.java.lang.String
        System.out.println(rt.getSuperType().hasUnresolvableGenerics()); // false
        System.out.println(ResolvableType.forInstance(new ArrayList<String>()).hasUnresolvableGenerics()); // true
    }
}


+ Recent posts