code: public static ClassStub parseClass(URL url) throws IOException {
          URI uri;
          try {
              uri = url.toURI();
          } catch (URISyntaxException e) {
              throw new GroovyRuntimeException(e);
          }
  
          SoftReference<ClassStub> ref = StubCache.map.get(uri);
          ClassStub stub = ref == null ? null : ref.get();
          if (stub == null) {
              DecompilingVisitor visitor = new DecompilingVisitor();
  
              try (InputStream stream = new BufferedInputStream(URLStreams.openUncachedStream(url))) {
                  new ClassReader(stream).accept(visitor, ClassReader.SKIP_FRAMES);
              }
              stub = visitor.result;
              StubCache.map.put(uri, new SoftReference<ClassStub>(stub));
          }
          return stub;
      }
docs: Loads the URL contents and parses them with ASM, producing a {@link ClassStub} object representing the structure of
  the corresponding class file. Stubs are cached and reused if queried several times with equal URLs.
  
  @param url an URL from a class loader, most likely a file system file or a JAR entry.
  @return the class stub
  @throws IOException if reading from this URL is impossible