Ich habe das gerade heute entdeckt, als einer meiner Komponententests aufgrund eines Upgrades von Java 7 auf Java 8 fehlschlug. Der Komponententest ruft eine Methode auf, die versucht, eine Annotation für eine Methode zu finden, die mit einer anderen Klasse versehen ist Rückgabetyp.Warum funktioniert isAnnotationPresent zwischen Java 7 und Java 8 anders?
In Java 7, isAnnotationPresent
scheint nur Anmerkungen zu finden, wenn sie wirklich im Code deklariert wurden. In Java 8 scheint isAnnotationPresent
Anmerkungen zu enthalten, die in untergeordneten Klassen deklariert wurden.
Um dies zu veranschaulichen, habe ich eine einfache (??) Testklasse IAPTest (für IsAnnotationPresentTest) erstellt.
Auf der neuesten Java 7 (1.7.0_79 zum Zeitpunkt des Schreibens), diese Methode druckt "falsch". Auf dem neuesten Java 8 (1.8.0_66 zum Zeitpunkt des Schreibens) gibt diese Methode "true" aus. Ich würde intuitiv erwarten, dass es "falsch" druckt.
Warum ist das? Bedeutet dies einen Fehler in Java oder eine beabsichtigte Änderung in der Funktionsweise von Java?
EDIT: Nur die genauen Befehle zu zeigen, habe ich dies zu replizieren (in einem Verzeichnis mit IAPTest.java identisch mit dem Codeblock oben):
C:\test-isannotationpresent>del *.class
C:\test-isannotationpresent>set JAVA_HOME=C:\nma\Toolsets\AJB1\OracleJDK\jdk1.8.0_66
C:\test-isannotationpresent>set PATH=%PATH%;C:\nma\Toolsets\AJB1\OracleJDK\jdk1.8.0_66\bin
C:\test-isannotationpresent>java -version
java version "1.8.0_66"
Java(TM) SE Runtime Environment (build 1.8.0_66-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.66-b17, mixed mode)
C:\test-isannotationpresent>javac IAPTest.java
C:\test-isannotationpresent>java IAPTest
true
C:\test-isannotationpresent>
Hmm, das druckt für mich "falsch": Eclipse Mars 4.5.1, JDK 1.8.0_51. – Tunaki
Warum denken Sie, dass Anmerkungen "in Kinderklassen" deklariert wurden? Sie haben die Methode in "B" kommentiert und suchen die * deklarierten Methoden * von 'B' und sonst nichts. Es sind keine Kinderklassen involviert. – Holger
@Holger wenn ich nach den deklarierten Methoden von 'B' suche, finde ich zwei Methoden. Eine Methode repräsentiert die Methode in der Kindklasse und eine Methode repräsentiert die Methode in der Elternklasse. Das können Sie an den Rückgabetypen erkennen. 'B.class.getDeclaredMethods(). Length == 2' sowohl in Java 7 als auch in 8. Da ich den Rückgabetyp überprüfe, um sicherzustellen, dass die Elternklassenmethode die referenzierte ist (Rückgabetyp ist' I' und nicht 'IE'), die Methode in' A' hat keine Annotation, sondern nur die Annotation in der Kindklasse 'B'. – Kidburla