package org.nutz.lang.util;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 通过读取Class文件,获得方法形参名称列表
* @author wendal(wendal1985@gmail.com)
*
*/
public class MethodParamNamesScaner {
/**
* 获取Method的形参名称列表
* @param method 需要解析的方法
* @return 形参名称列表,如果没有调试信息,将返回null
*/
public static List<String> getParamNames(Method method) {
try {
int size = method.getParameterTypes().length;
if (size == 0)
return new ArrayList<String>(0);
List<String> list = ClassMetaReader.getParamNames(method.getDeclaringClass()).get(ClassMetaReader.getKey(method));
if (list == null)
return null;
if (list.size() == size)
return list;
if (list.size() > size)
return list.subList(0, size);
return null;
} catch (Throwable e) {
throw new RuntimeException(e);
}
}
/**
* 获取Constructor的形参名称列表
* @param constructor 需要解析的构造函数
* @return 形参名称列表,如果没有调试信息,将返回null
*/
public static List<String> getParamNames(Constructor<?> constructor) {
try {
int size = constructor.getParameterTypes().length;
if (size == 0)
return new ArrayList<String>(0);
List<String> list = ClassMetaReader.getParamNames(constructor.getDeclaringClass()).get(ClassMetaReader.getKey(constructor));
if (list != null && list.size() != size)
return list.subList(0, size);
return list;
} catch (Throwable e) {
throw new RuntimeException(e);
}
}
public static Map<String, List<String>> getParamNames(Class<?> klass) throws IOException {
String key = klass.getName();
if (caches.containsKey(key))
return caches.get(key);
InputStream in = klass.getResourceAsStream("/" + klass.getName().replace('.', '/') + ".class");
Map<String, List<String>> names = getParamNames(in);
caches.put(key, names);
return names;
}
public static Map<String, List<String>> getParamNames(InputStream ins) throws IOException {
if (ins == null)
return new HashMap<String, List<String>>();
return ClassMetaReader.build(ins).paramNames;
}
protected static Map<String, Map<String, List<String>>> caches = new HashMap<String, Map<String,List<String>>>();
}