获取接口下面所有实现类工具。

package com.example.activity.activitydemo.designmode.factory.simple;

import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;

/**

  • @author ZhaoLB

  • @version 1.0.0

  • @date 2019/6/21
    */
    public class ClassUtils {

    //给一个接口,返回这个接口的所有实现类
    public static List getAllClassByInterface(Class c) {
    List returnClassList = new ArrayList(); //返回结果

     //如果不是一个接口,则不做处理
     if (c.isInterface()) {
         //获得当前的包名
         String packageName = c.getPackage().getName();
         try {
             //获得当前包下以及子包下的所有类
             List 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包中不能查找
    private static List getClasses(String packageName)
    throws ClassNotFoundException, IOException {
    ClassLoader classLoader = Thread.currentThread()
    .getContextClassLoader();
    String path = packageName.replace(’.’, ‘/’);

     Enumeration resources = classLoader.getResources(path);
     List dirs = new ArrayList();
     while (resources.hasMoreElements()) {
         URL resource = resources.nextElement();
         // 注意URL编码,需要进行转码
         dirs.add(new File(URLDecoder.decode(resource.getFile())));
     }
    
     ArrayList classes = new ArrayList();
     for (File directory : dirs) {
    
         classes.addAll(findClasses(directory, packageName));
     }
     return classes;
    

    }

    /**

    • 查找类下面对象的文件集合

    • @param directory

    • @param packageName

    • @return

    • @throws ClassNotFoundException
      */
      private static List findClasses(File directory, String packageName)
      throws ClassNotFoundException {

      List classes = new ArrayList();
      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;
      }

}

你可能感兴趣的:(小知识)