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