토비의 봄 TV 2.5회 - 수퍼 타입 토큰(2), 스프링 ResolvableTypeIT/Spring Framework2018. 2. 3. 23:22
Table of Contents
(시청일 : 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
}
}
'IT > Spring Framework' 카테고리의 다른 글
토비의 봄 TV 6회 스프링 리액티브 프로그래밍 (2) - Reactive Streams - Operators (0) | 2018.02.03 |
---|---|
토비의 봄 TV 5회 스프링 리액티브 프로그래밍 (1) - Reactive Streams (0) | 2018.02.03 |
토비의 봄 TV 4회 (2) Generics에서 와일드카드 활용법, 람다와 인터섹션 타입을 이용한 동적인 기능확장법 (0) | 2018.02.03 |
토비의 봄 TV 4회 (1) 자바 Generics (0) | 2018.02.03 |
Annotation 정리 (0) | 2018.02.01 |
@DEAN :: Dean Story
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!