java获取父类的所有子类:探索Java中父类的所有子类

实现实现Java可以通过反射机制获取指定类的所有子类,提供一个示例代码:

实现

Java可以通过反射机制获取指定类的所有子类,提供一个示例代码:


java
public static List> getAllSubClass(Class superClass) {
    List> subCl = new ArrayList<>();
    // 获取当前线程的类加载器
    ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
    String packageName = superClass.getPackage().getName();
    try {
        // 获取指定包名下的所有类
        Enumeration dirs = classLoader.getResources(packageName.replace(".", "/"));
        while (dirs.hasMoreElements()) {
            URL url = dirs.nextElement();
            String protocol = url.getProtocol();
            if ("file".equals(protocol)) {
                // 获取包的物理路径
                String filePath = URLDecoder.decode(url.getFile(), "UTF-8");
                findAndAddSubClInPackageByFile(packageName, filePath, subCl, superClass);
            } else if ("jar".equals(protocol)) {
                JarFile jar = ((JarURLConnection) url.openConnection()).getJarFile();
                Enumeration entries = jar.entries();
                while (entries.hasMoreElements()) {
                    JarEntry entry = entries.nextElement();
                    String name = entry.getName();
                    if (name.charAt(0) == '/') {
                        name = name.substring(1);
                    }
                    if (name.startsWith(packageName.replace(".", "/"))) {
                        int idx = name.lastIndexOf('/');
                        if (idx != -1) {
                            packageName = name.substring(0, idx).replace("/", ".");
                        }
                        if (name.endsWith(".class") && !entry.isDirectory()) {
                            String className = name.substring(packageName.length() + 1, name.length() - 6);
                            try {
                                Class clazz = Class.forName(packageName + '.' + className);
                                if (superClass.isAssignableFrom(clazz) && !superClass.equals(clazz)) {
                                    subCl.add(clazz);
                                }
                            } catch (ClassNotFoundException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                }
            }
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
    return subCl;
}
/**
 * 在package对应的路径下找到所有的class
 */
public static void findAndAddSubClInPackageByFile(String packageName, String packagePath, List> subCl, Class superClass) {
    File dir = new File(packagePath);
    if (!dir.exists() || !dir.isDirectory()) {
        return;
    }
    File[] files = dir.listFiles(file -> (file.isFile() && file.getName().endsWith(".class")) || file.isDirectory());
    assert files != null;
    for (File file : files) {
        String fileName = file.getName();
        if (file.isFile()) {
            String className = fileName.substring(0, fileName.length() - 6);
            try {
                Class clazz = Class.forName(packageName + '.' + className);
                if (superClass.isAssignableFrom(clazz) && !superClass.equals(clazz)) {
                    subCl.add(cl
                        

本站系公益性非盈利分享网址,本文来自用户投稿,不代表边看边学立场,如若转载,请注明出处

(68)
java gui框架:栏 标题栏
上一篇
java 键值对集合:Exploring the Benefits of Java Key-Value Pairs
下一篇

相关推荐

发表评论

登录 后才能评论

评论列表(61条)