On 19/04/2019 01:33, Sundara Mohan M wrote:
Hi,
    I was scanning all classes (to find all annotated class) using the
URLClassLoader.getUrls() methods to find all URL and find it with JDK8.
Since JDK9 onwards all App/System Class loaders are not deriving from
URLClassLoader it doesn't work anymore. (solution of making ucp variable
inside BuiltinClassLoader accesible and reading URLs works).
I think you are looking for the "java.class.path" system property. Split the value, map each element to a file path and file URL, and you should the equivalent to the array of URLs that getURLs would have given you. Same limitations too in that it's just the initial class path and doesn't taken into account additions that arise when JAR files have the Class-Path attribute.


What is the proper way to scan all(AppClassLoader + any other class loader)
classes?

This is a bigger question. I suspect you are looking to enumerate all the resources in all modules in the boot layer. The following will print the names of all resources in all modules in the boot layer and might give you ideas:

     ModuleLayer.boot().configuration().modules().forEach(m -> {
            System.out.format("module %s%n", m.name());
            try (ModuleReader reader = m.reference().open()) {
                reader.list().forEach(rn -> System.out.format("    %s%n", rn));
            } catch (IOException ioe) {
                throw new UncheckedIOException(ioe);
            }
        });

In addition you want the resources on the class path and I think you have code for this already once you map the value of java.class.path to a sequence of file URLs.

-Alan

Reply via email to