-
Notifications
You must be signed in to change notification settings - Fork 6.2k
8255560: Class::isRecord should check that the current class is final and not abstract #1543
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
Class::isRecord should check that the current class is final and not abstract
|
👋 Welcome back chegar! A progress list of the required criteria for merging this PR into |
|
/csr |
|
@ChrisHegarty this pull request will not be integrated until the CSR request JDK-8257520 for issue JDK-8255560 has been approved. |
|
@ChrisHegarty The following label will be automatically applied to this pull request:
When this pull request is ready to be reviewed, an "RFR" email will be sent to the corresponding mailing list. If you would like to change these labels, use the /label pull request command. |
Webrevs
|
| out.println("\n--- testBasicRecords ---"); | ||
| record EmptyRecord () { } | ||
| assertTrue(EmptyRecord.class.isRecord()); | ||
| assertTrue(EmptyRecord.class.getRecordComponents() != null); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Better to have a more precise check for empty array
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Good idea - done.
mlchung
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The change looks good with a couple of minor suggestion.
| * record components, that is, {@link #getRecordComponents()} returns a | ||
| * non-null value. | ||
| * class is {@code java.lang.Record}. A record class is | ||
| * {@link Modifier#FINAL}. A record class has (possibly zero) record |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nit: {@linkplain Modifier#FINAL final}.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Good idea - done.
mlchung
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
{@link ... final} should be @linkplain. Otherwise, looks good.
Oops! Yes, changed. |
|
@ChrisHegarty this pull request can not be integrated into git checkout isRecord
git fetch https://git.openjdk.java.net/jdk master
git merge FETCH_HEAD
# resolve conflicts and follow the instructions given by git merge
git commit -m "Merge master"
git push |
|
@ChrisHegarty This change now passes all automated pre-integration checks. ℹ️ This project also has non-automated pre-integration requirements. Please see the file CONTRIBUTING.md for details. After integration, the commit message for the final commit will be: You can use pull request commands such as /summary, /contributor and /issue to adjust it as needed. At the time when this comment was updated there had been 3 new commits pushed to the
Please see this link for an up-to-date comparison between the source branch of this pull request and the ➡️ To integrate this PR with the above commit message to the |
|
/integrate |
|
@ChrisHegarty Since your change was applied there have been 5 commits pushed to the
Your commit was automatically rebased without conflicts. Pushed as commit 5a03e47. 💡 You may see a message that your pull request was closed with unmerged commits. This can be safely ignored. |
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:
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.
Progress
Issue
Reviewers
Download
$ git fetch https://git.openjdk.java.net/jdk pull/1543/head:pull/1543$ git checkout pull/1543