View Javadoc
1   /*
2    * MIT License
3    * Copyright (c) 2006-2025 JMockit developers
4    * See LICENSE file for full license text.
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  }