On Tue, 1 Dec 2020 19:34:11 GMT, Chris Hegarty <[email protected]> wrote:
> Update Class::isRecord to only return true for classes that are final.
>
> The removal of non-specified JVM checks on classes with a Record Attribute
> (see JDK-8255342), has resulted in more types of loadable classes that may
> contain a Record Attribute. Since these checks are not performed by the JVM
> anymore, Class::isRecord, and by extension Class::getRecordComponents, may
> return true or component values, respectively, for classes that are not
> well-formed record classes (as per the JLS), .e.g. non-final or abstract
> classes, that contain a record Attribute.
>
> Core Reflection, Class::isRecord, already asserts checks that the JVM does
> not, e.g. that the direct superclass is java.lang.Record. Some points from
> the Java Language Specification for record classes:
>
> 1. It is a compile-time error if a record declaration has the modifier
> abstract.
> 2. A record declaration is implicitly final.
> 3. The direct superclass type of a record class is Record.
>
> Class::isRecord already ensures no.3. This issue proposes to add explicit
> checks in Core Reflection to ensure no.1 and no.2, since the JVM now allows
> such classes that contain a Record Attribute to be loaded.
The change looks good with a couple of minor suggestion.
src/java.base/share/classes/java/lang/Class.java line 3668:
> 3666: * <p> The {@linkplain #getSuperclass() direct superclass} of a
> record
> 3667: * class is {@code java.lang.Record}. A record class is
> 3668: * {@link Modifier#FINAL}. A record class has (possibly zero) record
nit: `{@linkplain Modifier#FINAL final}`.
-------------
Marked as reviewed by mchung (Reviewer).
PR: https://git.openjdk.java.net/jdk/pull/1543