code: private void addClassesByFile(ClassLoader classLoader, String packageName, String packagePath) {
          // 获取此包的目录 建立一个File,如果不存在或者 也不是目录就直接返回
          File dir = new File(packagePath);
          if (!dir.exists() || !dir.isDirectory()) {
              return;
          }
  
          // 如果存在,就获取包下的所有文件,包括目录,筛选出目录和.class文件.
          File[] dirfiles = dir.listFiles(new FileFilter() {
              @Override
              public boolean accept(File file) {
                  return (file.isDirectory()) || StringHelper.isClassFile(file.getName());
              }
          });
          if (dirfiles == null) {
              return;
          }
  
          // 循环所有文件,如果是目录 则继续扫描
          for (File file : dirfiles) {
              if (file.isDirectory()) {
                  this.addClassesByFile(classLoader, packageName + "." + file.getName(), file.getAbsolutePath());
                  continue;
              }
  
              // 如果是java类文件 去掉后面的.class,只留下类名，添加到集合中去.
              String className = file.getName().substring(0, file.getName().lastIndexOf('.'));
              this.addClassByName(classLoader, packageName + '.' + className);
          }
      }
docs: 以文件的形式来获取包下的所有Class.
  
  @param classLoader 类加载器
  @param packageName 包名
  @param packagePath 包路径