docs: private void doScanPackageClassesByJar(String basePackage, URL url,
                                             final boolean recursive, Set<Class<?>> classes) {
          String package2Path = basePackage.replace('.', '/');
          JarFile jar;
          try {
              jar = ((JarURLConnection) url.openConnection()).getJarFile();
              Enumeration<JarEntry> entries = jar.entries();
              while (entries.hasMoreElements()) {
                  JarEntry entry = entries.nextElement();
                  String name = entry.getName();
                  if (!name.startsWith(package2Path) || entry.isDirectory()) {
                      continue;
                  }
  
                  // 判断是否递归搜索子包
                  if (!recursive
                          && name.lastIndexOf('/') != package2Path.length()) {
                      continue;
                  }
                  // 判断是否过滤 inner class
                  if (this.excludeInner && name.indexOf('$') != -1) {
                      continue;
                  }
                  String classSimpleName = name.substring(name.lastIndexOf('/') + 1);
                  // 判定是否符合过滤条件
                  if (this.filterClassName(classSimpleName)) {
                      String className = name.replace('/', '.');
                      className = className.substring(0, className.length() - 6);
                      try {
                          classes.add(Thread.currentThread().getContextClassLoader().loadClass(className));
                      } catch (ClassNotFoundException e) {
                          throw new LtsRuntimeException(e);
                      }
                  }
              }
          } catch (IOException e) {
              throw new LtsRuntimeException(e);
          }
      }