View Javadoc
1   /*
2    * Copyright (c) 2006 JMockit developers
3    * This file is subject to the terms of the MIT license (see LICENSE.txt).
4    */
5   package mockit.internal.util;
6   
7   import edu.umd.cs.findbugs.annotations.NonNull;
8   
9   import java.util.EnumSet;
10  import java.util.List;
11  
12  import mockit.asm.metadata.ClassMetadataReader;
13  import mockit.asm.metadata.ClassMetadataReader.Attribute;
14  import mockit.asm.metadata.ClassMetadataReader.MethodInfo;
15  import mockit.internal.ClassFile;
16  import mockit.internal.state.ParameterNames;
17  
18  public final class ParameterNameExtractor {
19      private static final EnumSet<Attribute> PARAMETERS = EnumSet.of(Attribute.Parameters);
20  
21      private ParameterNameExtractor() {
22      }
23  
24      @NonNull
25      public static String extractNames(@NonNull Class<?> classOfInterest) {
26          String className = classOfInterest.getName();
27          String classDesc = className.replace('.', '/');
28  
29          if (!ParameterNames.hasNamesForClass(classDesc)) {
30              byte[] classfile = ClassFile.readBytesFromClassFile(classDesc);
31              ClassMetadataReader cmr = new ClassMetadataReader(classfile, PARAMETERS);
32              List<MethodInfo> methods = cmr.getMethods();
33  
34              for (MethodInfo method : methods) {
35                  if (!method.isSynthetic()) {
36                      String[] parameters = method.parameters;
37  
38                      if (parameters != null) {
39                          ParameterNames.register(classDesc, method.name, method.desc, parameters);
40                      }
41                  }
42              }
43          }
44  
45          return classDesc;
46      }
47  }