package com.smilezl.learn.clsutil;


import java.io.File;

import java.io.IOException;

import java.net.URL;

import java.util.ArrayList;

import java.util.Enumeration;

import java.util.List;



/**

 * getallclassByInterface

 * @author zhuolin

 *

 */

public class ClassUtils {

@SuppressWarnings({ "rawtypes", "unchecked" })

public static List getAllClassByInterface(Class c) {

List classList = new ArrayList();

if (c.isInterface()) {

String packageName = c.getPackage().getName();

try {

List allClass = getClasses(packageName);//获取包下所有类

for (int i = 0; i < allClass.size(); i++) {

if (c.isAssignableFrom(allClass.get(i))) {//判断是否是个接口

if (!c.equals(allClass.get(i))) {

classList.add(allClass.get(i));

}

}

}

} catch (ClassNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}

return classList;

}

/**

* 从一个包中查找出所有的类,在jar包中不能查找

* @param packageName

* @return

*/

@SuppressWarnings("rawtypes")

private static List getClasses(String packageName) throws ClassNotFoundException, IOException{

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();

String path = packageName.replace('.', '/');

Enumeration resources = classLoader.getResources(path);

List dirs = new ArrayList();

while (resources.hasMoreElements()) {

URL resource = resources.nextElement();

dirs.add(new File(resource.getFile()));

}

ArrayList classes = new ArrayList();

for (File directory : dirs) {

classes.addAll(findClass(directory, packageName));

}

return classes;

}


@SuppressWarnings("rawtypes")

private static List findClass(File directory, String packageName) throws ClassNotFoundException {

ArrayList classes = new ArrayList();

if (!directory.exists()) {

return classes;

}

File[] files = directory.listFiles();

for (File file : files) {

if (file.isDirectory()) {

classes.addAll(findClass(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;

}


public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException {

List list = getAllClassByInterface(Human.class);

for (Class c : list) {

Human man = (Human) Class.forName(c.getName()).newInstance();

man.talk();

}

}


}