java 根据接口查找到当前包及子包下所有的实现类

2022-06-16 12:06:43

工具类如下:

publicclassClassUtils{//给一个接口,返回这个接口的所有实现类publicstatic List<Class>getAllClassByInterface(Classc){
        List<Class> returnClassList=newArrayList<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(ClassNotFoundException e){
                e.printStackTrace();}catch(IOException e){
                e.printStackTrace();}}return returnClassList;}//从一个包中查找出所有的类,在jar包中不能查找privatestatic 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=newArrayList<File>();while(resources.hasMoreElements()){
            URL resource= resources.nextElement();
            dirs.add(newFile(resource.getFile()));}
        ArrayList<Class> classes=newArrayList<Class>();for(File directory: dirs){
            classes.addAll(findClasses(directory, packageName));}return classes;}privatestatic List<Class>findClasses(File directory, String packageName)throws ClassNotFoundException{
        List<Class> classes=newArrayList<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()));}elseif(file.getName().endsWith(".class")){
                classes.add(Class.forName(packageName+'.'+ file.getName().substring(0, file.getName().length()-6)));}}return classes;}}

随便写一个接口:

publicinterfaceHuman{voidlaugh();voidcry();voidtalk();}

实现类1:

publicclassBlackHumanimplementsHuman{@Overridepublicvoidcry(){
        System.out.println("黑人会哭");}@Overridepublicvoidlaugh(){
        System.out.println("黑人会笑");}@Overridepublicvoidtalk(){
        System.out.println("黑人可以说话,一般人听不懂");}}

实现类2:

publicclassYellowHumanimplementsHuman{@Overridepublicvoidcry(){
        System.out.println("黄色人种会哭");}@Overridepublicvoidlaugh(){
        System.out.println("黄色人种会大笑,幸福呀!");}@Overridepublicvoidtalk(){
        System.out.println("黄色人种会说话,一般说的都是双字节");}}

实现类3:

publicclassWhiteHumanimplementsHuman{@Overridepublicvoidcry(){
        System.out.println("白色人种会哭");}@Overridepublicvoidlaugh(){
        System.out.println("白色人种会大笑,侵略的笑声");}@Overridepublicvoidtalk(){
        System.out.println("白色人种会说话,一般都是但是单字节!");}}

测试代码:

publicclassTest{publicstaticvoidmain(String[] args){
        List<Class> concreteHumanList= ClassUtils.getAllClassByInterface(Human.class);for(int i=0; i< concreteHumanList.size(); i++){
            System.out.println(concreteHumanList.get(i));}}}

结果截图:
在这里插入图片描述
文件目录如下:在这里插入图片描述

  • 作者:LING超
  • 原文链接:https://blog.csdn.net/qq_16013529/article/details/108993207
    更新时间:2022-06-16 12:06:43