<div dir="ltr">Hi Stephen,<div>I agree: there's no way to get defined packages for the boot class loader directly via Package.getDefinedPackage. They are not accessible via the system or platform class loaders. The alternative approaches via Package.getDefinedPackages() or getPackage() can be intercepted by custom class loaders as well.</div><div>Since the introduction of the Module system, package is now seen more like a property, that a package in a class loader always maps to one module. (This trick has been useful in defining classes with MethodHandles.Lookup)</div><div><br></div><div>I think we probably need a way to work around this restriction; it indeed makes little sense that regular java code cannot access the boot loader packages reliably. I think we can do this as easy as making ClassLoader.getPackages() and getPackage() public like getDefinedPackages() or getDefinedPackage(), but the impact is unsure.</div><div><br></div><div>P.S. About the package class itself, we can probably upgrade its nested VersionInfo class to a record, and make Package itself final.</div><div><br></div><div>Chen Liang</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sun, Aug 11, 2024 at 5:50 PM Stephen Colebourne <<a href="mailto:scolebourne@joda.org">scolebourne@joda.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">On Sun, 11 Aug 2024 at 17:19, Alan Bateman <<a href="mailto:alan.bateman@oracle.com" target="_blank">alan.bateman@oracle.com</a>> wrote:<br>
> Package.getPackage is deprecated a long time, I don't think we've seen too many complaints. Nowadays it's probably not too useful except to get to package annotations (everything else in that API dates from JDK 1.2 and the since removed extension mechanism).<br>
><br>
> The set of package names for packages in the modules defined to the boot loader can be obtained with code like this:<br>
><br>
>     ModuleLayer.boot()<br>
>                 .modules()<br>
>                 .stream()<br>
>                 .filter(m -> m.getClassLoader() == null)<br>
>                 .flatMap(m -> m.getPackages().stream())<br>
>                 .collect(Collectors.toSet());<br>
><br>
> which I think is what you are looking for here.<br>
<br>
That doesn't quite work as it returns String package names, not<br>
Package objects (I need the Package object to maintain compatibility).<br>
Sounds like Package.getPackages() is the only current workaround.<br>
<br>
FWIW I do think there is a case to review the deprecation text of<br>
Package.getPackage(String).<br>
<br>
thanks<br>
Stephen<br>
</blockquote></div>