1
2
3
4
5
6 package mockit.internal.classGeneration;
7
8 import edu.umd.cs.findbugs.annotations.NonNull;
9
10 import java.lang.reflect.ParameterizedType;
11 import java.lang.reflect.Type;
12
13 import mockit.internal.reflection.GenericTypeReflection;
14 import mockit.internal.util.Utilities;
15
16 public final class MockedTypeInfo {
17 @NonNull
18 public final GenericTypeReflection genericTypeMap;
19 @NonNull
20 public final String implementationSignature;
21
22 public MockedTypeInfo(@NonNull Type mockedType) {
23 Class<?> mockedClass = Utilities.getClassType(mockedType);
24 genericTypeMap = new GenericTypeReflection(mockedClass, mockedType);
25
26 String signature = getGenericClassSignature(mockedType);
27 String classDesc = mockedClass.getName().replace('.', '/');
28 implementationSignature = 'L' + classDesc + signature;
29 }
30
31 @NonNull
32 private static String getGenericClassSignature(@NonNull Type mockedType) {
33 StringBuilder signature = new StringBuilder(100);
34
35 if (mockedType instanceof ParameterizedType) {
36 ParameterizedType parameterizedType = (ParameterizedType) mockedType;
37 Type[] typeArguments = parameterizedType.getActualTypeArguments();
38
39 if (typeArguments.length > 0) {
40 signature.append('<');
41
42 for (Type typeArg : typeArguments) {
43 if (typeArg instanceof Class<?>) {
44 Class<?> classArg = (Class<?>) typeArg;
45 signature.append('L').append(classArg.getName().replace('.', '/')).append(';');
46 } else {
47 signature.append('*');
48 }
49 }
50
51 signature.append('>');
52 }
53 }
54
55 signature.append(';');
56 return signature.toString();
57 }
58 }