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

Mandy Chung mandy.chung at oracle.com
Thu Apr 2 00:09:00 UTC 2020


Hi Brian, et al,

Class is a Constable.  So a Class object for a hidden class can be asked 
to yield a ConstantDesc for the hidden class via 
Class::describeConstable.  It can also be asked to get the type 
descriptor string for the hidden class via Class:descriptorString.

A hidden class has no binary name. It cannot be referenced by other 
classes nominally. So hidden classes are not the kind of run-time 
entities of interest to the bytecode readers and writers.  I propose no 
ClassDesc for hidden classes.

The relevant APIs need update for hidden classes are:
1. ClassDesc::ofDescriptor

The current spec already specifies to throw IAE if the given name is not 
a binary name.

2. Class::describeConstable

There should be no ClassDesc for hidden classes.ClassDesc::ofDescriptor 
returns an empty Optional if it's a hidden class.

3. Class::descriptorString (inherited method fromTypeDescriptor)

Three options:
a) throws an exception
b) returns null
c) returns `La/b/C.0x1234;`

`Lookup:defineHiddenClass` specifies the name derived from the `class` 
file in the form of:
     `N` + "." + <suffix>

where N is the binary name indicated by the `class` file and <suffix> is 
an unqualified name that is guaranteed to be unique during this 
execution of the JVM.

But this is not a valid binary name; so not a field descriptor. This has 
a bigger impact to java.lang.constant.

None of the options is ideal.  I lean toward (b).  It's rare that a 
compiler or other tools using java.lang.constant API will use it on a 
hidden class.

Please advise.

Thanks
Mandy
[1] 
http://cr.openjdk.java.net/~mchung/valhalla/webrevs/hidden-classes/api/java.base/java/lang/invoke/MethodHandles.Lookup.html#defineHiddenClass(byte[],boolean,java.lang.invoke.MethodHandles.Lookup.ClassOption...)


More information about the valhalla-dev mailing list