Java RPC中的反射 (Server)
每次根据方法名来反射获取Method的成本太大,所以在bean初始化的时候,就将该服务下interface的方法都放到HashMap里面
用来测试的interface
public interface TestApi {
List<Integer> listIds();
long convertId(long id);
}
扫描interface的方法
private <T> Map<String, Method> initMethodMap(Class<T> clz) {
Map<String, Method> methodMap = new HashMap<>();
Method[] methods = clz.getMethods();
for (Method method : methods) {
String methodDesc = ReflectUtil.getMethodDesc(method);
methodMap.put(methodDesc, method);
}
return methodMap;
}
参数desc获取
class ReflectUtil {
private static final String PARAM_SPLIT = ",";
private static final String EMPTY_PARAM = "void";
public static String getMethodParamDesc(Method method) {
if (method.getParameterTypes() == null || method.getParameterTypes().length == 0) {
return EMPTY_PARAM;
}
StringBuilder builder = new StringBuilder();
Class<?>[] clzs = method.getParameterTypes();
for (Class<?> clz : clzs) {
String className = getName(clz);
builder.append(className).append(PARAM_SPLIT);
}
return builder.substring(0, builder.length() - 1);
}
private static String getName(Class<?> clz) {
if (!clz.isArray()) {
return clz.getName();
}
StringBuilder sb = new StringBuilder();
sb.append(clz.getName());
while (clz.isArray()) {
sb.append("[]");
clz = clz.getComponentType();
}
return sb.toString();
}
}
注:代码摘自 weibo 的 rpc 框架 motan; 并有部分修改