Annotating lambda expressions
Alex Buckley
alex.buckley at oracle.com
Fri Jul 10 19:38:14 UTC 2015
On 7/10/2015 2:31 AM, Maurizio Cimadamore wrote:
> On 10/07/15 09:43, Ron Pressler wrote:
>> (Related to
>> http://mail.openjdk.java.net/pipermail/compiler-dev/2015-January/009220.html)
>>
>> It is useful to add an annotation to a lambda expression -- as in
>> foo(@Special () -> { ...}) -- which will be applied to the static
>> method implementing the lambda (not to the interface the lambda
>> implements). This would allow instrumentation tools operating on
>> method implementations to handle lambdas. So far, AFAICT, this is not
>> possible (or am I wrong?).
> This is not possible, currently - as Remi said; you have annotations on
> declarations (i.e. variable, classes, methods) - you have annotation on
> types (i.e. type of a cast, type argument, etc.) - but you don't have
> annotations on _expressions_.
> I take it that, under the current translation scheme, there seems to be
> a plausible description for what should happen when the lambda is
> annotated; but what if the lambda is turned into a method reference (by
> some IDE refactoring, or human intervention) ? In that case it is not
> guaranteed that there would still be a physical place where to put the
> annotation (unless we tell the compiler to 'expand' all annotated method
> references).
Yes, the problem with annotations-on-expressions is not the language
grammar but the storage of the annotations in the class file. With no
standard way of translating source expressions to bytecode, there can be
no standard API for retrieving annotations-on-expressions from bytecode.
More broadly, there has never been a standard reflective API capable of
inspecting method bodies.
This explains why JSR 308 stayed away from annotations-on-expressions --
we were not in a position to let them be read back. It was already bad
enough that some annotations-on-types are stored in the class file at
the level of individual bytecodes (e.g. an annotation on the type of a
cast) so are not retrievable by any standard reflective API.
Alex
More information about the compiler-dev
mailing list