Type Annotations for Inner class constructors

Werner Dietl wdietl at gmail.com
Fri Feb 7 12:02:39 PST 2014


Hi André,

thanks for your report!
This issue is already being tracked:

https://bugs.openjdk.java.net/browse/JDK-8029012

Cheers,
cu, WMD.

On Fri, Feb 7, 2014 at 4:02 AM, André Pankraz <andre at pankraz.de> wrote:
> Hi,
>
> another question: May be I couldn't find the exact definition of "formal
> parameter" for methods (I'm not a compiler / lang expert), but I observed
> this:
>
> If I have an Inner Class with a constructor, then artificial parameters are
> generated to inject the outer class instance into the inner class and
> remember the reference in attribute this$1 (for emulated outer access). In
> javac such synthetic parameters are generated before the original Java
> method parameters.
>
> If I use type annotations in such constructor methods, then the formal
> parameter index for TypeReference.METHOD_FORMAL_PARAMETER doesn't take such
> generated parameters into account.
>
> That means, if I have this:
>
>     class Outer<W> {
>         class Middle {
>             class Inner extends
>                     Outer<@Size(max = 21) String>. at Size(max = 22) Middle {
>
>                 @Nonnull
>                 private final Integer arg;
>
>                 public Inner(@Size(max = 23) Integer arg) {
>                     this.arg = arg;
>                 }
>     ....
>
> and I "decompile" this without replacing synthetic parameters and fields, I
> get this:
>
>     class Outer<W> {
>         final DecTestTypeAnnotations this$0;
>
>         Outer(DecTestTypeAnnotations arg0) {
>             this.this$0 = arg0;
>         }
>
>         class Middle {
>             final Outer this$1;
>
>             Middle(Outer arg0) {
>                 this.this$1 = arg0;
>             }
>
>             static Outer access$0(Middle arg0) {
>                 return arg0.this$1;
>             }
>
>             class Inner
>                     extends
>                     DecTestTypeAnnotations<U, V>.Outer<@Size(max = 21)
> String>. at Size(max = 22) Middle {
>                 private final @Nonnull
>                 Integer arg;
>                 final Middle this$2;
>
>                 public Inner(@Size(max = 23) DecTestTypeAnnotations arg0,
>                         Integer arg) {
>                     this.this$2 = arg0;
>                     super(Middle.access$0(arg0));
>                     this.arg = arg;
>                 }
> ...
>
>
>
> See how @Size(23) targets the synthetic parameter?
>
> My question is, is this intentional?
>
> Is a tool, that is interested in building a type model from the byteecode,
> responsible to recognize synthetic parameters to map the annotation to the
> right types?
> Is yes, is this recognition allways unambigiously possible? Not for all
> synthetic parameters are distinct rules enforced in the JVM spec, sometimes
> it's more up to the implementor how to do it. Lock alone how differently
> e.g. Eclipse and Java compile string-switches or concatanations - there are
> differences. Or is this all already considered?
>
> Cheers,
> André
>
>



-- 
http://www.google.com/profiles/wdietl


More information about the type-annotations-dev mailing list