根据父类获取同一个包(包括子包)下所有子类

来源:互联网 发布:js arguments 回调函数 编辑:程序博客网 时间:2024/06/14 15:39
    声明:文章内容全都是自己的学习总结,如有不对的地方请大家帮忙指出。有需要沟通交流的可加我QQ群:425120333    Java语言的三大特性是继承、封装、多态。继承指的是子类通过关键字extends继承父类、或者是implements实现接口。不管是继承父类还是实现接口,子类和父类都是建立了联系。这里提供了一个根据父类的类信息获取同一个包下的所有子类的信息,
import java.io.File;import java.io.IOException;import java.net.URL;import java.util.ArrayList;import java.util.Enumeration;import java.util.List;/** * @author 顽石的坚持 * @date 2017年4月27日 * @introduce:根据父类的类文件获取所以的子类类文件集合,要求父类和子类在同一个包中,或者子类在子包中 */public class ClassUtil {    @SuppressWarnings({ "unchecked", "rawtypes" })    public static List<Class> getSonClass(Class fatherClass) {        List<Class> sonClassList = new ArrayList<Class>();        String packageName = fatherClass.getPackage().getName();        List<Class> packageClassList = getPackageClass(packageName);        for (Class clazz : packageClassList) {            if (fatherClass.isAssignableFrom(clazz) && !fatherClass.equals(clazz)) {                sonClassList.add(clazz);            }        }        return sonClassList;    }    @SuppressWarnings({ "rawtypes" })    private static List<Class> getPackageClass(String packageName) {        ClassLoader loader = ClassUtil.class.getClassLoader();        String path = packageName.replace(".", "/");        Enumeration<URL> resources = null;        try {            resources = loader.getResources(path);        } catch (IOException e) {            e.printStackTrace();        }        List<File> fileList = new ArrayList<File>();        while (resources.hasMoreElements()) {            URL resource = resources.nextElement();            fileList.add(new File(resource.getFile()));        }        ArrayList<Class> classList = new ArrayList<Class>();        for (File file : fileList) {            classList.addAll(findClass(file, packageName));        }        return classList;    }    @SuppressWarnings({ "rawtypes" })    private static List<Class> findClass(File file, String packageName) {        List<Class> classList = new ArrayList<Class>();        if (!file.exists()) {            return classList;        }        File[] fileArray = file.listFiles();        for (File subFile : fileArray) {            if (subFile.isDirectory()) {                assert !file.getName().contains(".");                classList.addAll(findClass(subFile, packageName + "." + subFile.getName()));            } else if (subFile.getName().endsWith(".class")) {                try {                    classList.add(Class.forName(packageName + "." + subFile.getName().split(".class")[0]));                } catch (ClassNotFoundException e) {                    e.printStackTrace();                }            }        }        return classList;    }}
0 0