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;
    }
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 ; }
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