Detail
Fehlerbehebung
Wichtig
Detail
#27843
Fehlende Annotation @Retention(RUNTIME) an der Annotation @NoDialogContentCheck
An der Annotation @NoDialogContentCheck fehlt die Meta-Annotation @Retention(RUNTIME). Dadurch steht sie zur Laufzeit eventuell nicht zur Verfügung. Denn der Default für @Retention ist: RetentionPolicy.CLASS Und die überlässt es der Willkür der JVM:
Annotations are to be recorded in the class file by the compiler but **need not be retained by the VM at run time**. This is the default behavior.
Dadurch wird die Annotation @NoDialogContentCheck zur Laufzeit manchmal nicht gefunden, wodurch Dialoge fälschlicherweise nicht geöffnet werden dürfen.
Es gibt vermutlich eine Handvoll weiterer solcher Fälle. Eine Text Suche in *.java Dateien findet 120 Treffer für @interface, aber nur 113 für @Retention.
Umsetzung
- Alle Annotationen bekommen eine Retention Annotation.
- Alle Annotationen bekommen die Retention RUNTIME.
Begründung: Dadurch gehen sicher keine Annotationen zur Laufzeit verloren und wir müssen uns über die korrekte Retention keine Gedanken machen. Das Java nicht alle Annotationen bis zur Laufzeit aufhebt sondern manche vorher wegwirft, stammt aus dem Jahr 2002, als Speicher sehr viel kleiner waren als heute. Heute ist diese Unterscheidung nicht mehr notwendig.
Test
- In *.java Dateien nach @interface suchen.
- In *.java Dateien nach folgendem Regex suchen: @Retention\((RetentionPolicy\.)?RUNTIME\)
- Beide Suchen müssen gleich viele Ergebnisse liefern.