1
2
3
4
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 }