import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
/**
 * 
 * <p>
 * Title: PackageUtils.java
 * </p>
 * <p>
 * E-Mail: 176291935@qq.com
 * </p>
 * <p>
 * QQ: 176291935
 * </p>
 * <p>
 * Http: iaiai.iteye.com
 * </p>
 * <p>
 * Create time: 2011-8-2
 * </p>
 * 
 * @author 丸子
 * @version 0.0.1
 */
public class PackageUtils {
  /**
   * 扫描给定包及子包内的所有类
   * 
   * @param packageName
   *            给定的包名
   * @return The classes
   * @throws ClassNotFoundException
   * @throws IOException
   */
  private static Class[] getClasses(String packageName)
      throws ClassNotFoundException, IOException {
    Class cla = PackageUtils.class;
    String path = packageName.replace('.', '/');
    Enumeration<URL> resources = cla.getClassLoader().getResources(path);
    List<File> dirs = new ArrayList<File>();
    while (resources.hasMoreElements()) {
      URL resource = resources.nextElement();
      dirs.add(new File(resource.getFile()));
    }
    ArrayList<Class> classes = new ArrayList<Class>();
    for (File directory : dirs) {
      classes.addAll(findClasses(directory, packageName));
    }
    return classes.toArray(new Class[classes.size()]);
  }
  /**
   * 找到制定包内的所有class文件
   * 
   * @param directory
   *            目录名称
   * @param packageName
   *            包名称
   * @return The classes
   * @throws ClassNotFoundException
   */
  private static List<Class> findClasses(File directory, String packageName)
      throws ClassNotFoundException {
    List<Class> classes = new ArrayList<Class>();
    if (!directory.exists()) {
      return classes;
    }
    File[] files = directory.listFiles();
    for (File file : files) {
      if (file.isDirectory()) {
        classes.addAll(findClasses(file,
            packageName + "." + file.getName()));
      } else if (file.getName().endsWith(".class")) {
        classes.add(Class.forName(packageName
            + '.'
            + file.getName().substring(0,
                file.getName().length() - 6)));
      }
    }
    return classes;
  }
  /**
   * @throws IOException
   * @throws ClassNotFoundException
   * 
   */
  public static void main(String[] args) throws Exception {
    Class[] clas = PackageUtils.getClasses("org");
    for (Class cla : clas) {
      System.out.println(cla.getName());
    }
  }
}