code: private void addClassByJar(ClassLoader classLoader, URL url, String packageName, String packageDirName) {
          // 从url中获取jar，然后从此jar包得到一个枚举类，然后进行迭代.
          JarFile jar;
          try {
              jar = ((JarURLConnection) url.openConnection()).getJarFile();
              Enumeration<JarEntry> entries = jar.entries();
              while (entries.hasMoreElements()) {
                  // 获取jar里的一个实体 可以是目录 和一些jar包里的其他文件 如META-INF等文件
                  JarEntry entry = entries.nextElement();
                  String name = entry.getName();
                  // 如果是以/开头的,则获取后面的字符串
                  if (name.charAt(0) == '/') {
                      name = name.substring(1);
                  }
  
                  // 如果前半部分和定义的包名相同.
                  if (name.startsWith(packageDirName)) {
                      int index = name.lastIndexOf('/');
                      // 如果以"/"结尾，则是一个包，获取包名并把"/"替换成"."
                      if (index != -1) {
                          packageName = name.substring(0, index).replace('/', '.');
                      }
                      // 如果可以迭代下去 并且是一个包,如果是一个.class文件 而且不是目录
                      if (index != -1 && name.endsWith(".class") && !entry.isDirectory()) {
                          // 去掉后面的".class" 获取真正的类名
                          String className = name.substring(packageName.length() + 1, name.length() - 6);
                          this.addClassByName(classLoader, packageName + '.' + className);
                      }
                  }
              }
          } catch (IOException expected) {
              // 此处不打印堆栈信息.
              log.warn("从jar文件中读取class出错.");
          }
      }
docs: 通过识别jar的形式将其下的所有class添加到classSet集合中.
  @param classLoader 类加载器
  @param url URL实例
  @param packageName 包名
  @param packageDirName 包路径名