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

Peter Levart peter.levart at gmail.com
Sun Apr 12 08:28:06 UTC 2020


Hi,

Are '.' and '/' the only characters on the table? The problems with 
those are that both are used as hierarchical name delimiters in one way 
or another and code exists that converts one to another. If there was a 
3rd character chosen such that:

- it would make the descriptor "invalid" for resolving
- otherwise not be unexpected in parsing logic

...then such composition would be ideal. I think that there could event 
be a place for such names in the specification: syntactically valid but 
unresolvable names.

The problem is that it is hard to find such a character isn't it? But 
let's try...

What about character '\' - backslash ? It seems very unlikely that this 
character would appear in the name of a class. In Java language it is 
not allowed, but even in other languages it is probably treated as some 
kind of delimiter and therefore unlikely to be part of the derived class 
name. Would it be too much to declare that it must not appear in the 
name of the class?

Even if it was not forbidden, it would be very unlikely to appear in 
practice. By analogy: Java anonymous classes are kind of "hidden", just 
on another level - in the language. They do use valid class names 
though, even valid in Java language, but there's no problem with that in 
practice. Why? Because the outer class typically controls the 
"namespace" where they appear in. With java modules, there is additional 
control that is imposed on the package namespace.

Regards, Peter


On 4/12/20 5:35 AM, Mandy Chung wrote:
>
>
> On 4/8/20 3:35 PM, John Rose wrote:
>> On Apr 8, 2020, at 3:31 PM, John Rose <john.r.rose at oracle.com 
>> <mailto:john.r.rose at oracle.com>> wrote:
>>>
>>> In both c and c’ there will probably be a cascading failure
>>> if the name foo/Bar/123Z or foo/Bar is resolved.  In c’ there
>>> is an additional cascading failure when the user that was
>>> parsing the signature goes back for more parameters and
>>> finds a slash (instead of LZBHCIJFD[).  The thing that tipped
>>> me over to c’ is that extra diagnostic: Even though it happens
>>> after the user picked up the bad descriptor, it happens closer
>>> to the place where the error has its root cause, which is that
>>> somebody is trying to parse an (intentionally) illegal descriptor.
>>
>> P.S. Having the slash+suffix *outside* the L; envelope basically
>> rubs any parser’s nose in the fact that there’s something illegal
>> here.  Putting it inside the envelope hides the error from the
>> parser—which may be a good thing sometimes!  But it means
>> that the odd name foo/Bar.123Z will float somewhere else
>> and may or may not be misinterpreted.  If it’s handed to
>> Class.forName you can bet that the dot will change its meaning.
>> On balance, I slightly prefer the fail-fast properties of c’.
>
> Thanks John.
>
> I have implemented to define the descriptor string for a hidden class 
> of this form:
>      "L" + N + ";" + "/" + <suffix>
>
> Please see [1] for the review thread.
>
> For your reference, the webrev is:
> http://cr.openjdk.java.net/~mchung/valhalla/webrevs/hidden-classes/webrev.06-delta/ 
>
>
> Specdiff:
> http://cr.openjdk.java.net/~mchung/valhalla/webrevs/hidden-classes/specdiff-inc/overview-summary.html 
>
>
> The spec of `Lookup::defineHiddenClass`, `Class::descriptorString` and
> `MethodType::descriptorString` are updated to return the descriptor of
> this form for a hidden class.   To support hidden class,
> `java.lang.invoke.TypeDescriptor` spec is revised such that a
> `TypeDescriptor` object can represent an entity that may not be
> described in nominal form.   The serviceability APIs that return a type
> descriptor are updated.  This webrev includes a couple other JVM TI and
> java.instrument spec clarification w.r.t. hidden classes.
>
> Mandy
> [1] 
> https://mail.openjdk.java.net/pipermail/valhalla-dev/2020-April/007121.html




More information about the valhalla-dev mailing list