package com.elphin.framework.util.acd;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
/**
* Created with IntelliJ IDEA.
* User: guangongbo
* Date: 13-6-25
* Time: 下午11:07
*/
class BindingFinder {
private static final HashMap<Class, BindingBean[]> bindingTableCache = new HashMap<Class, BindingBean[]>();
BindingFinder() {
}
BindingBean[] finding(Class<?> target) {
BindingBean[] contents = null;
synchronized (bindingTableCache) {
contents = bindingTableCache.get(target);
}
if (contents != null) {
return contents;
}
ArrayList<BindingBean> bindingBeans = new ArrayList<BindingBean>();
Class<?> cls = target;
boolean found = false;
do {
String name = cls.getCanonicalName();
if (name.startsWith("java.") || name.startsWith("javax.") || name.startsWith("android.")) {
break;
}
Method[] methods = cls.getDeclaredMethods();
for (int i = 0, len = methods.length; i < len; ++i) {
Binding binding = methods[i].getAnnotation(Binding.class);
if (binding == null) {
continue;
}
Id[] value = binding.value();
if (value == null || value.length == 0) {
continue;
}
Class<?>[] parameterTypes = methods[i].getParameterTypes();
Class<?>[] targetTypes = ActionParamsMap.ACTION_PARAM_TYPES.get(binding.type());
if (Arrays.equals(parameterTypes, targetTypes)) {
bindingBeans.add(new BindingBean(methods[i], binding));
found = true;
} else {
throw new IllegalStateException("参数类型匹配失败 -> \n\t" + Arrays.toString(parameterTypes)
+ " not match \n\t" + Arrays.toString(targetTypes));
}
}
cls = cls.getSuperclass();
} while (cls != null);
if (!found) {
throw new IllegalStateException("There is no binding method in " + target.getCanonicalName());
}
contents = new BindingBean[bindingBeans.size()];
bindingBeans.toArray(contents);
synchronized (bindingTableCache) {
bindingTableCache.put(target, contents);
}
return contents;
}
}