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

    声明:文章内容全都是自己的学习总结,如有不对的地方请大家帮忙指出。有需要沟通交流的可加我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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值