in xbean-reflect/src/main/java/org/apache/xbean/recipe/AsmParameterNameLoader.java [263:307]
public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
if (!name.equals(this.methodName)) {
return null;
}
try {
final List<String> parameterNames;
final boolean isStaticMethod;
if (methodName.equals("<init>")) {
Constructor constructor = constructorMap.get(desc);
if (constructor == null) {
return null;
}
parameterNames = new ArrayList<String>(constructor.getParameterTypes().length);
parameterNames.addAll(Collections.<String>nCopies(constructor.getParameterTypes().length, null));
constructorParameters.put(constructor, parameterNames);
isStaticMethod = false;
} else {
Method method = methodMap.get(desc);
if (method == null) {
return null;
}
parameterNames = new ArrayList<String>(method.getParameterTypes().length);
parameterNames.addAll(Collections.<String>nCopies(method.getParameterTypes().length, null));
methodParameters.put(method, parameterNames);
isStaticMethod = Modifier.isStatic(method.getModifiers());
}
return new MethodVisitor(ASM_VERSION) {
// assume static method until we get a first parameter name
public void visitLocalVariable(String name, String description, String signature, Label start, Label end, int index) {
if (isStaticMethod) {
parameterNames.set(index, name);
} else if (index > 0) {
// for non-static the 0th arg is "this" so we need to offset by -1
parameterNames.set(index - 1, name);
}
}
};
} catch (Exception e) {
this.exceptions.put(signature, e);
}
return null;
}