code: public Set<Class<?>> findAndAddClassesInPackageByFile(String packageName, String packagePath,
                                                            final boolean recursive) {
          LOGGER.debug("扫描包{}下、目录{}下的所有class", packageName, packagePath);
          Set<Class<?>> classes = new LinkedHashSet<>();
          // 获取此包的目录 建立一个File
          File dir = new File(packagePath);
          // 如果不存在或者 也不是目录就直接返回
          if (!dir.exists() || !dir.isDirectory()) {
              LOGGER.debug("用户定义包名 " + packageName + " 下没有任何文件");
              return Collections.emptySet();
          }
          // 如果存在 就获取包下的所有文件 包括目录
          File[] dirfiles = dir.listFiles(file -> (recursive && file.isDirectory())
                                                  || (file.getName().endsWith("" + "" + ".class")));
  
          if (dirfiles == null || dirfiles.length == 0) {
              return Collections.emptySet();
          }
  
          // 循环所有文件
          for (File file : dirfiles) {
              // 如果是目录 则继续扫描
              if (file.isDirectory()) {
                  classes.addAll(findAndAddClassesInPackageByFile(packageName + "/" + file.getName(),
                      file.getAbsolutePath(), recursive));
              } else {
                  // 如果是java类文件 去掉后面的.class 只留下类名
                  String className = file.getName().substring(0, file.getName().length() - 6);
                  try {
                      packageName = packageName.replaceAll("/", ".");
                      className = packageName + '.' + className;
                      classes.add(classLoader.loadClass(className));
                  } catch (Throwable e) {
                      LOGGER.error("添加用户自定义视图类错误 找不到此类的.class文件", e);
                  }
              }
          }
          return classes;
      }
docs: 扫描指定目录下的所有class
  
  @param packageName 指定目录
  @param packagePath 包名
  @param recursive   是否递归查找
  @return 指定目录下的所有class