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.util;
7   
8   import edu.umd.cs.findbugs.annotations.NonNull;
9   
10  import java.util.EnumSet;
11  import java.util.List;
12  
13  import mockit.asm.metadata.ClassMetadataReader;
14  import mockit.asm.metadata.ClassMetadataReader.Attribute;
15  import mockit.asm.metadata.ClassMetadataReader.MethodInfo;
16  import mockit.internal.ClassFile;
17  import mockit.internal.state.ParameterNames;
18  
19  public final class ParameterNameExtractor {
20      private static final EnumSet<Attribute> PARAMETERS = EnumSet.of(Attribute.Parameters);
21  
22      private ParameterNameExtractor() {
23      }
24  
25      @NonNull
26      public static String extractNames(@NonNull Class<?> classOfInterest) {
27          String className = classOfInterest.getName();
28          String classDesc = className.replace('.', '/');
29  
30          if (!ParameterNames.hasNamesForClass(classDesc)) {
31              byte[] classfile = ClassFile.readBytesFromClassFile(classDesc);
32              ClassMetadataReader cmr = new ClassMetadataReader(classfile, PARAMETERS);
33              List<MethodInfo> methods = cmr.getMethods();
34  
35              for (MethodInfo method : methods) {
36                  if (!method.isSynthetic()) {
37                      String[] parameters = method.parameters;
38  
39                      if (parameters != null) {
40                          ParameterNames.register(classDesc, method.name, method.desc, parameters);
41                      }
42                  }
43              }
44          }
45  
46          return classDesc;
47      }
48  }