Trust final fields in records

Brian Goetz brian.goetz at oracle.com
Fri Jun 12 16:56:35 UTC 2020


My concern about serialization frameworks is not so much that the setAccessible will fail (it won’t), but that they are not ready to treat records specially, so they will try to deserialize them like any other class, and then it will fail.  

If we make this change when records exit preview, this will catch maintainers of these frameworks unaware — things will just start breaking when their clients use records.  But if we give them a grace period (e.g., lock it down in 17), we need to ensure that they’ll use that time effectively, and not just kick the can down the road.  



> On Jun 12, 2020, at 12:53 PM, Mandy Chung <mandy.chung at oracle.com> wrote:
> 
> No change on setAccessible that will succeed on any fields as it is today.
> 
> The proposed change is that final fields of a record are not modifiable (i.e. no reflective write access) and  Field::set on a Field object with no reflective write access will throw IllegalAccessException.
> 
> Today Field::set behavior:
> - Static final fields have no write access
> - Non-static final fields in a hidden class have no write access
> - Non-static final fields on normal classes (that are not records) have reflective write access 
> 
> No change to the above.  
> 
> Mandy
> [1] https://download.java.net/java/early_access/jdk15/docs/api/java.base/java/lang/reflect/Field.html#set(java.lang.Object,java.lang.Object) <https://download.java.net/java/early_access/jdk15/docs/api/java.base/java/lang/reflect/Field.html#set(java.lang.Object,java.lang.Object)>
> 
> On 6/12/20 4:35 AM, Johannes Kuhn wrote:
>> Jackson will break. It loves to call setAccessible on everything - even when explicitly disabled [1]. 
>> 
>> The other thing to consider is if setAccessible should fail, or if it should still allow read access, similar to static final fields. 
>> 
>> - Johannes 
>> 
>> [1]: https://github.com/FasterXML/jackson-databind/issues/2760 <https://github.com/FasterXML/jackson-databind/issues/2760> 
>> 
>> On 12-Jun-20 12:57, Brian Goetz wrote: 
>>> If the fields cannot be made accessible, this means that 3rd party serialization frameworks will choke on records, right? 
>>> 
>>> Sent from my iPad 
>>> 
>>>> On Jun 12, 2020, at 5:10 AM, Chris Hegarty <chris.hegarty at oracle.com> <mailto:chris.hegarty at oracle.com> wrote: 
>>>> 
>>>>  
>>>> 
>>>>> On 12 Jun 2020, at 02:52, Mandy Chung <mandy.chung at oracle.com> <mailto:mandy.chung at oracle.com> wrote: 
>>>>> 
>>>>> Hi Christoph, 
>>>>> 
>>>>> I can sponsor your patch.  I create https://bugs.openjdk.java.net/browse/JDK-8247444 <https://bugs.openjdk.java.net/browse/JDK-8247444>. 
>>>> This is great. I remember thinking (saying?) similar when we settled on record serialization not needing to muck around with field stuffing (among the motivating factors for how records deserialize). This is a great step forward, nice to see it progressing. 
>>>> 
>>>> -Chris. 
>> 
>> 
> 



More information about the valhalla-dev mailing list