62,614
社区成员
发帖
与我相关
我的任务
分享
/**
* 获取方法参数名
* @param clazz
* @param targetMethodName
* @return
* @author : luyanfeng.
* @date : 2014年9月18日
*/
public static String[] getMethodParamsNames(Class<?> clazz, String targetMethodName) {
try {
//
ClassPool pool = ClassPool.getDefault();
pool.insertClassPath(new ClassClassPath(clazz));
CtClass cc = pool.get(clazz.getName());
CtMethod cm = cc.getDeclaredMethod(targetMethodName);
MethodInfo methodInfo = cm.getMethodInfo();
CodeAttribute codeAttribute = methodInfo.getCodeAttribute();
LocalVariableAttribute attr = (LocalVariableAttribute) codeAttribute.getAttribute(LocalVariableAttribute.tag);
String[] variableNames = new String[cm.getParameterTypes().length];
int staticIndex = Modifier.isStatic(cm.getModifiers()) ? 0 : 1;
//FIXME 第一个参数会是this???????????
for (int i = 0; i < variableNames.length; i++) {
variableNames[i] = attr.variableName(i + staticIndex);
if(variableNames[i].equals("this")){
variableNames[i] = attr.variableName(i + (++staticIndex) );
}
}
return variableNames;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* <p>
* 获取方法的参数名
* </p>
*
* @param m
* @return
*/
public static String[] getMethodParamsNames(Method m) {
try {
final String[] paramNames = new String[m.getParameterTypes().length];
Class<?> declaringClass = m.getDeclaringClass();
String className = declaringClass.getName();
int lastDotIndex = className.lastIndexOf(".");
InputStream is = declaringClass.getResourceAsStream(className.substring(lastDotIndex + 1) + ".class");
ClassReader cr = new ClassReader(is);
cr.accept(new ClassVisitor(Opcodes.ASM4) {
@Override
public MethodVisitor visitMethod(final int access, final String name, final String desc, final String signature, final String[] exceptions) {
final Type[] args = Type.getArgumentTypes(desc);
// 方法名相同并且参数个数相同
if (!name.equals(m.getName()) || !sameType(args, m.getParameterTypes())) {
return super.visitMethod(access, name, desc, signature, exceptions);
}
MethodVisitor v = super.visitMethod(access, name, desc, signature, exceptions);
return new MethodVisitor(Opcodes.ASM4, v) {
@Override
public void visitLocalVariable(String name, String desc, String signature, Label start, Label end, int index) {
int i = index - 1;
// 如果是静态方法,则第一就是参数
// 如果不是静态方法,则第一个是"this",然后才是方法的参数
if (Modifier.isStatic(m.getModifiers())) {
i = index;
}
if (i >= 0 && i < paramNames.length) {
paramNames[i] = name;
}
super.visitLocalVariable(name, desc, signature, start, end, index);
}
};
}
}, 0);
return paramNames;
} catch (SecurityException | IOException e) {
e.printStackTrace();
}
return null;
}
ParameterNameDiscoverer pnd=new DefaultParameterNameDiscoverer();
String[] parameterNames=pnd.getParameterNames(用反射获取到的方法对象);//返回的就是方法中的参数名列表了