Skip to content

Commit 1167c2b

Browse files
committed
delete CodePath utils library, move GenericsUtil into this dir
1 parent d70af0e commit 1167c2b

File tree

2 files changed

+80
-0
lines changed

2 files changed

+80
-0
lines changed

library/libs/codepath-utils.jar

-4.68 KB
Binary file not shown.
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
package com.codepath.utils;
2+
3+
import java.lang.reflect.*;
4+
import java.util.ArrayList;
5+
import java.util.HashMap;
6+
import java.util.List;
7+
import java.util.Map;
8+
9+
10+
@SuppressWarnings("rawtypes")
11+
public class GenericsUtil {
12+
public static <T> List<Class<?>> getTypeArguments(Class<T> baseClass,
13+
Class<? extends T> childClass) {
14+
Map<Type, Type> resolvedTypes = new HashMap<Type, Type>();
15+
Type type = childClass;
16+
// start walking up the inheritance hierarchy until we hit baseClass
17+
while (!getClass(type).equals(baseClass)) {
18+
if (type instanceof Class) {
19+
type = ((Class) type).getGenericSuperclass();
20+
} else {
21+
ParameterizedType parameterizedType = (ParameterizedType) type;
22+
assert parameterizedType != null;
23+
Class<?> rawType = (Class) parameterizedType.getRawType();
24+
25+
Type[] actualTypeArguments = parameterizedType
26+
.getActualTypeArguments();
27+
TypeVariable<?>[] typeParameters = rawType.getTypeParameters();
28+
for (int i = 0; i < actualTypeArguments.length; i++) {
29+
resolvedTypes
30+
.put(typeParameters[i], actualTypeArguments[i]);
31+
}
32+
33+
if (!rawType.equals(baseClass)) {
34+
type = rawType.getGenericSuperclass();
35+
}
36+
}
37+
}
38+
39+
// finally, for each actual type argument provided to baseClass,
40+
// determine (if possible)
41+
// the raw class for that type argument.
42+
Type[] actualTypeArguments;
43+
if (type instanceof Class) {
44+
actualTypeArguments = ((Class) type).getTypeParameters();
45+
} else {
46+
assert !(type == null);
47+
actualTypeArguments = ((ParameterizedType) type)
48+
.getActualTypeArguments();
49+
}
50+
List<Class<?>> typeArgumentsAsClasses = new ArrayList<Class<?>>();
51+
// resolve types by chasing down type variables.
52+
for (Type baseType : actualTypeArguments) {
53+
while (resolvedTypes.containsKey(baseType)) {
54+
baseType = resolvedTypes.get(baseType);
55+
}
56+
typeArgumentsAsClasses.add(getClass(baseType));
57+
}
58+
return typeArgumentsAsClasses;
59+
}
60+
61+
private static Class<?> getClass(Type type) {
62+
if (type instanceof Class) {
63+
return (Class) type;
64+
} else if (type instanceof ParameterizedType) {
65+
return getClass(((ParameterizedType) type).getRawType());
66+
} else if (type instanceof GenericArrayType) {
67+
Type componentType = ((GenericArrayType) type)
68+
.getGenericComponentType();
69+
Class<?> componentClass = getClass(componentType);
70+
if (componentClass != null) {
71+
return Array.newInstance(componentClass, 0).getClass();
72+
} else {
73+
return null;
74+
}
75+
} else {
76+
return null;
77+
}
78+
}
79+
80+
}

0 commit comments

Comments
 (0)