zoukankan      html  css  js  c++  java
  • 给定一个接口返回这个接口所有实现类

    package com.dobn.bdgcgl.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;  
     
    public class ClassUtils {  
          
        /** 
         *  
         * 描述:给一个接口,返回这个接口的所有实现类 
         */ 
        public static List<Class> getAllClassByInterface(Class c){  
            //返回结果  
            List<Class> returnClassList = new ArrayList<Class>();  
            //如果不是一个接口则不做处理  
            if (c.isInterface()) {  
                //获取当前包名  
                String packageName = c.getPackage().getName();  
                try {  
                    //获取当前包下以及子包下的所有类  
                    List<Class> allClass = getClasses(packageName);  
                    //判断是否是同一个接口  
                    for (int i = 0; i < allClass.size(); i++) {  
                        if (c.isAssignableFrom(allClass.get(i))) {  
                            if (!c.equals(allClass.get(i))) {  
                                returnClassList.add(allClass.get(i));  
                            }  
                        }  
                    }  
                } catch (Exception e) {  
                    // TODO Auto-generated catch block  
                    e.printStackTrace();  
                }  
            }  
            return returnClassList;  
        }  
          
        private static List<Class> getClasses(String packageName) throws ClassNotFoundException, IOException {  
            ClassLoader classLoader = Thread.currentThread().getContextClassLoader();  
            String path = packageName.replace(".", "/");  
            Enumeration<URL> resources = classLoader.getResources(path);  
            List<File> dirs = new ArrayList<File>();  
            while (resources.hasMoreElements()) {  
                URL resource = resources.nextElement();  
                dirs.add(new File(resource.getFile()));  
            }  
            ArrayList<Class> classes = new ArrayList<Class>();  
            for (File directory : dirs) {  
                classes.addAll(findClasses(directory, packageName));  
            }  
            return classes;  
        }  
          
        private static List<Class> findClasses(File directory, String packageName) throws ClassNotFoundException {  
            List<Class> classes = new ArrayList<Class>();  
            if (!directory.exists()) {  
                return classes;  
            }  
            File[] files = directory.listFiles();  
            for (File file : files) {  
                if (file.isDirectory()) {  
                    assert !file.getName().contains(".");  
                    classes.addAll(findClasses(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;  
        }  
     
    } 
     
  • 相关阅读:
    【iOS开发】动态添加子视图 UIView 的正确方法
    70.容器分配ip
    79.scp命令
    78.ssh隧道
    77.手撕sql语句
    76.ssh基于秘钥形式连接
    75.python删除目录
    74.ssh服务介绍(基于密码连接)
    73.nginx跨域
    72.nginx文件配置
  • 原文地址:https://www.cnblogs.com/cunkouzh/p/4924513.html
Copyright © 2011-2022 走看看