反射通过父类反射出所有的子类

    1.  

package com.thunisoft.test;

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;

    }

}

 

 

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值