Are classes generated by LambdaMetafactory special?
Raffaello Giulietti
raffaello.giulietti at gmail.com
Tue Aug 6 19:07:39 UTC 2019
Hi Mandy,
thanks for the deeper explanation: all this makes much sense.
Greetings
Raffaello
>One property of a lambda proxy class is to be in the same nest as the
>caller class as it's logically part of the caller class (as it may
>access its private member). VM anonymous class is an interim
>implementation solution until we provide a way to define a dynamically
>generated class as a nestmate of an existing class.
>
>Second property of proxy classes is that proxy classes are not
>symbolically referenced by other class and they are sole implementation
>of some methods or some classes/interfaces. Proxy classes can be
>defined as ordinary class while it has to ensure that the class name
>must be unique in the global VM namespace. There is overhead generating
>such a class to the system dictionary (not to mention loader
>constraints). OTOH the name of a proxy class is only useful for
>troubleshooting but entirely not needed at runtime.
>
>Mandy
>
>On 8/5/19 2:51 PM, Raffaello Giulietti wrote:
>> Thanks Rémi and Mandy.
>>
>> I still don't get the full rationale on why lambda classes should be
>> treated so specially but at least I now understand the current behavior.
>>
>>
>> Greetings
>> Raffaello
>>
>>
>>
>>
>> On 05/08/2019 23.34, Remi Forax wrote:
>>> It is intentional and the implementation details are planned to
>>> change in the future
>>> (there are already some patches in the valhalla/nestmates branch).
>>>
>>> The slash in the name is because you can create several classes from
>>> the same bytecode by patching it at runtime,
>>> the number after the slash is for each patching.
>>>
>>> Unlike a classical class, the class is not stored by a classloader in
>>> order to be garbage collected sooner, hence you can not find it this
>>> Class.forName.
>>>
>>> Intrumentation of a lambda proxy tends to fail because there is no
>>> API to get the patched data and because the class name is not
>>> resolvable (see above) so the easier solution was to mark those
>>> classes as non-modifiable. This may change in the future.
>>>
>>> Rémi
>>>
>>> ----- Mail original -----
>>>> De: "raffaello giulietti" <raffaello.giulietti at gmail.com>
>>>> À: "core-libs-dev" <core-libs-dev at openjdk.java.net>
>>>> Envoyé: Lundi 5 Août 2019 23:02:48
>>>> Objet: Are classes generated by LambdaMetafactory special?
>>>
>>>> Hello,
>>>>
>>>> experiment suggests that classes generated by
>>>> java.lang.invoke.LambdaMetafactory are somewhat special:
>>>>
>>>> (1) getName() on the class returns a string of the form
>>>> Xxx$$Lambda$nn/0xhhh
>>>> where Xxx is a fully qualified class name (with periods '.' as package
>>>> separators), nn is a decimal integer and hhh is a hex integer. What's
>>>> the role of the slash '/' in the name?
>>>>
>>>> (2) An invocation of Class.forName() with that name fails.
>>>>
>>>> (3) Invoking java.lang.instrument.Instrumentation.isModifiableClass()
>>>> with that class as an argument returns false.
>>>>
>>>> Is this intentional or is it a bug?
>>>>
>>>>
>>>> Greetings
>>>> Raffaello
>
>
More information about the core-libs-dev
mailing list