java.lang.constant.ClassDesc and TypeDescriptor for hidden class??

Remi Forax forax at univ-mlv.fr
Thu Apr 2 19:03:21 UTC 2020


----- Mail original -----
> De: "Brian Goetz" <brian.goetz at oracle.com>
> À: "mandy chung" <mandy.chung at oracle.com>, "John Rose" <john.r.rose at oracle.com>
> Cc: "valhalla-dev" <valhalla-dev at openjdk.java.net>
> Envoyé: Jeudi 2 Avril 2020 20:34:31
> Objet: Re: java.lang.constant.ClassDesc and TypeDescriptor for hidden class??

> Mandy reminded me that descriptorString() is specified to return a JLS
> 4.2.3 field descriptor, and so (c) would violate that spec.  I think
> this tilts the table away from (c), even though this string is arguably
> useful (though not clear to whom.)
> 
> While the spec for TypeDescriptor doesn't explicitly say "for use in a
> classfile" or "for reflective instantiation", its hard to imagine use
> cases that don't terminate in one of these situations, at which point,
> we're going to fail.  So it is not clear whether we do anyone favors by
> having Class::descriptorString() return something "helpful" that is not
> really helpful.
> 
> Given the choice between (a) and (b), well, both are going to result in
> user surprises (though, the spec for TD::descriptorString doesn't
> prohibit returning null.)  Taken together, I think (b) is less awful
> than (a), so I revise my answer to (b).

(a) and (b) are incompatible changes.
returning null is equivalent of throwing a NPE because at least the existing callers will not expect null, so i think (a) is better because you can have a proper error message. 
And the javadoc can explain that testing myClass.isHidden() upfront is the right way to avoid the exception.

Rémi

> 
> On 4/2/2020 2:11 PM, Brian Goetz wrote:
>>
>>>
>>> 2. public String descriptorString()
>>>     Returns the type descriptor string for this class.
>>>
>>> This method returns String, *not* an Optional.  This is the main
>>> method in question what to do with hidden class.
>>>> Three options:
>>>> a) throws an exception
>>>> b) returns null
>>>> c) returns `La/b/C.0x1234;`
>>>
>>> Any other options to handle Class::descriptorString()?
>>>
>>
>> In this case, (c) seems reasonable; the TypeDescriptor.OfField
>> interface does not say anything about suitability for embedding in a
> > constant pool, resolution with class loaders, etc.


More information about the valhalla-dev mailing list