import java.lang.reflect.Method;
import java.util.HashSet;
import java.util.Set;
public abstract class ClassUtils {
static public Method searchMethod(Method[] methods, String methodName,
Class>... paramType) {
if (methods == null || methods.length == 0)
return null;
for (Method method : methods) {
Class>[] m = method.getParameterTypes();
if (methods.length == 1 && m.length == 0) {
return method;
} else if (m.length == paramType.length) {
for (int i = 0; i < paramType.length; i++) {
if (m[i].equals(paramType[i])) {
return method;
}
}
}
}
return null;
}
static public Method getMethod(Class type, String methodName,
Class>... params) {
if (type != null && methodName != null && methodName.length() > 0) {
try {
if (params != null && params.length > 0 && params[0] != null) {
return type.getMethod(methodName, params);
} else {
return type.getMethod(methodName);
}
} catch (NoSuchMethodException e) {
}
}
return null;
}
static Set> getAllClasses(Set> classes, Class> type) {
Class>[] list = type.getClasses();
for (Class> t : list) {
classes = getAllClasses(classes, t);
classes.add(t);
}
Class>[] interfaces = type.getInterfaces();
for (Class> t : interfaces) {
classes = getAllClasses(classes, t);
classes.add(t);
}
Class> superClass = type.getSuperclass();
if (superClass != null && superClass != Object.class) {
Set> superClasses = getAllClasses(classes, superClass);
for (Class> t : superClasses) {
classes = getAllClasses(classes, t);
classes.add(t);
}
}
return classes;
}
static public Method searchMethod(Class> type, String methodName,
Class>... paramType) {
Method m = paramType.length > 0 && paramType[0] != null ? getMethod(
type, methodName, paramType) : getMethod(type, methodName);
if (m != null)
return m;
// paramType is interface?
if (paramType != null && paramType.length > 0 && paramType[0] != null) {
Set> p = getAllClasses(new HashSet>(),
paramType[0]);
// Class>[] p = paramType[0].getDeclaredClasses();
if (p != null) {
for (Class> refIF : p) {
m = getMethod(type, methodName, refIF);
if (m != null)
return m;
}
}
// paramType is Object.class
Class>[] argsType = new Class>[paramType.length];
for (int i = 0; i < paramType.length; i++) {
argsType[i] = Object.class;
}
m = getMethod(type, methodName, argsType);
}
return m;
}
}