RFR: 8256867: Classes with empty PermittedSubclasses attribute cannot be extended

Mandy Chung mchung at openjdk.java.net
Tue Dec 8 00:02:13 UTC 2020

On Mon, 7 Dec 2020 19:51:38 GMT, Harold Seigel <hseigel at openjdk.org> wrote:

> Please review this fix for JDK-8256867.  This change no longer throws a ClassFormatError exception when loading a class whose PermittedSubclasses attribute is empty (contains no classes).  Instead, the class is treated as a sealed class which cannot be extended nor implemented.  This new behavior conforms to the JVM Spec.
> This change required changing Class.permittedSubclasses() to return an empty array for classes with empty PermittedSubclasses attributes, and to return null for non-sealed classes.
> This fix was tested with Mach5 tiers 1-2 on Linux, MacOS, and Windows, and tiers 3-5 on Linux x64.
> Thanks, Harold

src/java.base/share/classes/java/lang/Class.java line 4396:

> 4394:      * is unspecified. If this {@code Class} object represents a primitive type,
> 4395:      * {@code void}, an array type, or a class or interface that is not sealed,
> 4396:      * then null is returned.

nit: s/null/`{@code null}`

I'd suggest to clarify if this sealed class or interface has no permitted subclass, something like this:
Returns an array containing {@code Class} objects representing the
direct subinterfaces or subclasses permitted to extend or
implement this class or interface if it is sealed.  The order of such elements
is unspecified.   The array is empty if this sealed class or interface has no
permitted subclass. 

`@return` needs to be revised as well:
@return an array of {@code Class} objects of the permitted subclasses of this sealed class or interface,
     or {@null} if this class or interface is not sealed


PR: https://git.openjdk.java.net/jdk/pull/1675

More information about the compiler-dev mailing list