2014-02-27 8 views
9

Ich stieß auf einen merkwürdigen Effekt in Verbindung mit Anmerkungen zu Methodenparametern in einer geschachtelten Klasse. Sieht für mich wie ein Compiler-Problem aus. Details und Schritte zum Reproduzieren finden Sie unten.Java Annotationen - Javac Compiler Fehler?

Kompilieren Sie die folgende Klasse mit javac (Ich habe javac 1.7.0_51 verwendet). Beachten Sie den annotierten Parameter "boolean param3".

import java.lang.annotation.Annotation; 
import java.lang.annotation.Retention; 
import java.lang.annotation.RetentionPolicy; 

public class TestAnnotations { 

    public String a; 

    @Retention(RetentionPolicy.CLASS) 
    @interface MyAnnotation {} 

    protected class TestInner { 

     public TestInner(String param1, Object param2, 
            @MyAnnotation boolean param3) {} 

     public void accessField() { 
      System.out.println(TestAnnotations.this.a); 
     } 
    } 
} 

dann die verschachtelte Klasse mit javap untersuchen (das heißt javap -p -v -c TestAnnotations $ TestInner.class). Der Konstruktor sieht folgendermaßen aus.

public test.TestAnnotations$TestInner(test.TestAnnotations, java.lang.String, 
               java.lang.Object, boolean); 
    flags: ACC_PUBLIC 
    Code: 
    stack=2, locals=5, args_size=5 
     0: aload_0 
     1: aload_1 
     2: putfield  #1     // Field this$0:Ltest/TestAnnotations; 
     5: aload_0 
     6: invokespecial #2     // Method java/lang/Object."<init>":()V 
     9: return 
    LineNumberTable: 
     line 16: 0 
    RuntimeInvisibleParameterAnnotations: 
    0: 
    1: 
    2: 
     0: #18() 

Notieren Sie die Anzahl der Anmerkungen in dem Attribute RuntimeInvisibleParameterAnnotations - es ist 3. Zur gleichen Zeit wir wegen einer zusätzlichen test.TestAnnotations am Anfang nun 4 Methodenparameter beobachten (es wird verwendet, um einen Verweis auf TestAnnotations passieren .dies in die innere Klasse). Das bedeutet, @MyAnnotation bezieht sich nun auf das Objekt param2, das um 1 nach links verschoben ist.

Nach der Virtual Machine Specification die Anzahl von Anmerkungen sollte das gleiche wie die Anzahl der Verfahrensparameter sein:

num_parameters

Der Wert des num_parameters Elements die Anzahl der Parameter von gibt die Methode, die durch die Struktur method_info dargestellt wird, auf der die Annotation erfolgt. (Diese Duplikate Informationen, die aus dem Methodenbeschreiber extrahiert werden konnte (§4.3.3).)

hier klar wir eine Verletzung zu sehen. Kennt jemand den Grund? Ist es wirklich, was es zu sein scheint, nur ein Compiler Bug?

Antwort

6

Dies ist ein Javac-Compiler-Bug, siehe: https://bugs.openjdk.java.net/browse/JDK-8065132, die ich gerade eingereicht habe.

+1

Gut zu wissen. Dieses Problem wurde mit dem Decompiler Fernflower, der jetzt Teil von IntelliJ IDEA ist, gefunden. Wir mussten eine Problemumgehung implementieren, um Annotationen auf Parameter abzubilden, beginnend am Ende der Liste. – Stiver

Verwandte Themen