Reflection Java

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;
  }
}