getPermittedSubclasses() on j.l.rClass returning an array of ClassDesc
Brian Goetz
brian.goetz at oracle.com
Sat May 9 14:53:11 UTC 2020
It's not just that it is _inconvenient_ to return the Class, "because of
class loading." It may not be _possible_, as the class may not be
there, but we would still like to be able to reflect what the class says.
So the choices are:
- Don't make this information accessible at all
- Return descriptor strings
- Return ClassDesc
Of the latter two, clearly ClassDesc is better than descriptor strings.
(You could argue that we should go from array to List; this is an OK
option but then the "for consistency" patrol will criticize it.)
I think a better question is: what do we expect people to DO with this
information? That class C permits D doesn't confer anything about what
any given user can do with D; D might be nonexistent, or inaccessible to
some clients. Or it might not have any members that are accessible to
some client. So what would a client plan to do with the Class?
On 5/8/2020 6:53 PM, Remi Forax wrote:
> The current draft of the reflection API for the sealed keyword adds a method getPermittedSubclasses() [1] to java.lang.Class.
>
> I'm not fully sure that returning an array of ClassDesc is the right choice here, mainly for two reasons,
>
> 1/ it's weird to return an array of ClassDesc when all others similar methods return an array of Class,
> I know why a ClassDesc might be "better" because it avoid the class loading,
> but it also means that now to fully understand java.lang.Class, people has to understand how java.lang.constant works.
> The java.lang.constant API was not designed for that, the first line of the overview of this package talks about descriptors, constant pool and indy, not something beginners should worry about.
>
> 2/ returning a symbolic view (ClassDesc) instead of a Class is *very* error prone from a user POV, to resolve a ClassDesc to a class, the user as to provide a Lookup
> and there is a good chance that users will pick the wrong ones. The number of people that understand classloading and how Lookup works is < 10,
> even experts struggle given the number of time the Lookup API as to be patched in recent years. Returning a ClassDesc in this context is like asking a child
> to read the serial number of a loaded gun.
> Perhaps a way to mitigate that is to provide the code a user should use to get the equivalent classes in the javadoc of getPermittedSubclasses().
>
> cheers,
> Rémi
>
> [1] https://bugs.openjdk.java.net/browse/JDK-8244556
More information about the amber-spec-observers
mailing list