代码片段,得到所有实现接口且在同包下的类

/**
     * 得到所有实现接口而且在同包下的的类
     * @param aClass
     * @return
     * @throws IOException
     * @throws ClassNotFoundException
     */
    public List<Class> getImplClass(Class aClass) throws IOException, ClassNotFoundException {
        List<Class> list = new ArrayList<>();
        List<Class> resultList = new ArrayList<>();
        String aPackage=aClass.getPackage().getName();
        ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
        Enumeration<URL> enumeration =classLoader.getResources(aPackage.replaceAll("\\.","/"));
        while (enumeration.hasMoreElements()) {
            list.addAll(findClass(enumeration.nextElement().getPath(), aPackage));
        }
        for (Class c:list) {
            if (isImplInterface(c) && !aClass.equals(c) && !resultList.contains(c)) {

                resultList.add(c);
            }
        }
        resultList.add(0,Class.forName("com.huawei.SysCode"));
        return resultList;
    }

    private boolean isImplInterface(Class aClass) {

        Class[] classes=aClass.getInterfaces();
        for (Class c : classes) {
            if(INTERFACE_CLASS.equals(c.getName()) {
                return true;
            }
        }
        return false;
    }

    /**
     * 得到路径下所有class
     * @param dir
     * @param packageName
     * @return
     * @throws ClassNotFoundException
     */
    private List<Class> findClass(String dir, String packageName) throws ClassNotFoundException {
        List<Class> list = new ArrayList<>();
        File f = new File(dir);
        if (!f.exists()) {
            return list;
        }
        File[] files=f.listFiles();
        for (File file : files) {
            if (file.isDirectory())) {
                list.addAll(findClass(file.getPath(), packageName+"."+file.getName()));
            }else if(file.getName().matches(".+\\.class$")){
                list.add(Class.forName(packageName+"."+file.getName().replaceAll("\\.class$","")));
            }
        }
        return list;
    }

  

时间: 2024-10-07 13:26:41

代码片段,得到所有实现接口且在同包下的类的相关文章

(手写)mybatis 核心配置文件和接口不在同一包下的解决方案

smart-sh-mybatis项目 app.xml文件中此处配置为: 1 <!-- 从整合包里找,org.mybatis:mybatis-spring:1.2.4 --> 2 <!-- sqlSessionFactory --> 3 <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> 4 <!-- 数据库连接池 --&

Notepad++编辑器——Verilog、代码片段、直接编译

Notepad++是一款精致小巧的编辑器,自带Verilog语法识别功能,插件也挺好用的.尤其是利用插件实现代码片段,大大节省我们写Verilog的时间.此外少有人知道的,可以利用某款插件实现在Notepad++界面中编译Verilog的功能.下面就来说说这几个功能要如何设置. 版本:Notepad++ 7.6.6 ,32位 //========================================================================//==      安装

C#程序员经常用到的10个实用代码片段 - 操作系统

原文地址  如果你是一个C#程序员,那么本文介绍的10个C#常用代码片段一定会给你带来帮助,从底层的资源操作,到上层的UI应用,这些代码也许能给你的开发节省不少时间.以下是原文: 1 读取操作系统和CLR的版本 1 OperatingSystem os = System.Environment.OSVersion; 2 Console.WriteLine("Platform: {0}", os.Platform); 3 Console.WriteLine("Service P

超轻量级DI容器框架Google Guice与Spring框架的区别教程详解及其demo代码片段分享

原创不易,转载请注明出处:超轻量级DI容器框架Google Guice与Spring框架的区别教程详解及其demo代码片段分享 代码下载地址:http://www.zuidaima.com/share/1759689106541568.htm 依赖注入,DI(Dependency Injection),它的作用自然不必多说,提及DI容器,例如spring,picoContainer,EJB容器等等,近日,google诞生了更轻巧的DI容器--Guice! 废话不多讲了,先看看Guice是如何实现

solr分布式索引【实战一、分片配置读取:工具类configUtil.java,读取配置代码片段,配置实例】

1 private static Properties prop = new Properties(); 2 3 private static String confFilePath = "conf" + File.separator + "config.properties";// 配置文件目录 4 static { 5 // 加载properties 6 InputStream is = null; 7 InputStreamReader isr = null;

100个直接可以拿来用的JavaScript实用功能代码片段

把平时网站上常用的一些实用功能代码片段通通收集起来,方面网友们学习使用,利用好的话可以加快网友们的开发速度,提高工作效率. 目录如下: 1.原生JavaScript实现字符串长度截取2.原生JavaScript获取域名主机3.原生JavaScript清除空格4.原生JavaScript替换全部5.原生JavaScript转义html标签6.原生JavaScript还原html标签7.原生JavaScript时间日期格式转换8.原生JavaScript判断是否为数字类型9.原生JavaScript

关于UITabBar各部分自定义的代码片段

一.自定义TabBar选项卡背景默认UITabBarController的TabBar背景是黑色的,如何自定义成背景图片呢? UITabBarController *tabBarController = [[UITabBarController alloc] init]; // 获取选项卡控制器视图的所有子视图,保存到一数组中 NSArray *array = [tabBarController.view subviews]; // 索引值为1的应该就是TabBar UITabBar  *tab

常用python日期、日志、获取内容循环的代码片段

近段时间对shell脚本和python进行了梳理,将一些脚本中常用的内容,考虑多种方法整理出来,形成有用的代码片段,这样就可以在需要的时候直接使用,也可以用于备忘和思考.本次整理的代码片段有: python中日期.时间常用获取方法: 记录处理日志的logging模块使用:从目录,文件,命名结果中,获取循环条件进行循环.我将这些有用的代码片段整理在一个Python脚本中了,并且测试可用.脚本内容如下: #!/usr/bin/env python #_*_coding:utf8_*_ #常用日期和时

sublime text3 之snippet编写代码片段

sublime text 3 中有个强大的功能就是可以编写各种文件类型的snippet代码片段,可以节省大量的时间. 文件名为:jekyll-top.sublime-snippet(.sublime-snippet)后缀必须这样 <snippet> <content><![CDATA[/** * author:qinbb * title:智能推荐${1:标题} */ ${2}]]></content> <!-- Optional: Set a tabT