2016-06-10 7 views
3

Ich verwende Spring, um eine ModelMap zu erstellen, die von Moustache gerendert und dann analysiert wird. Aus diesem Grund habe ich einige Klassen, die nur existieren, um Daten für die Bequemlichkeit von Moustache zu wickeln.Kann ich @SuppressWarnings in Java aggregieren, proxy oder imitieren?

Diese Klassen enthalten Felder und Methoden, die nie im Code verwendet werden, aber tatsächlich von Spring (und wiederum von Moustache) verwendet werden. Ich möchte ausdrücklich darauf hinweisen, dass dies durch Anmerkungen versehen, die Klasse mit einem benutzerdefinierten Anmerkung @ForMustache beabsichtigt ist, die wie folgt aussieht:

@Target(ElementType.TYPE) 
@Retention(RetentionPolicy.SOURCE) 
public @interface ForMustache { 
} 

Mein Ziel ist es im Grunde eine andere Art @SuppressWarnings("unused") // For Mustache zu sagen.

Ich habe versucht, ForMustache mit @SuppressWarnings("unused") zu kommentieren, aber die Auswirkungen gelten innerhalb meiner Annotation, anstatt an den mit @ForMustache annotierten Typ weitergegeben zu werden.

Kann ich @SuppressWarnings("unused") mit einer anderen Anmerkung Proxy oder imitieren?

+1

Nein, diese Anmerkungen sind für den Compiler gedacht und werden sie nur wörtlich auf das Element anwenden, auf dem sie sich befinden. Aber vielleicht gibt es einen Weg, diese Warnung nicht auszulösen. – zapl

+0

[Diese Frage] (http://stackoverflow.com/questions/33345605/java-custom-annotation-aggregate-multiple-annotations) ist sehr eng verwandt mit dem, was Sie versuchen (Sie versuchen nur zu erstellen eine Meta-Annotation, die nur eine Annotation und nicht mehrere enthält. Dies kann sogar ein Duplikat dieser Frage sein. – JonK

+0

@zapl Danke für den Hinweis, ich werde versuchen zu untersuchen! –

Antwort

2

Die Annotation @SuppressWarnings ist für den Compiler und andere Kompilierzeit-Tools gedacht, die direkt mit den Quelldateien arbeiten.

Es wird auch als

@Retention(RetentionPolicy.SOURCE) 
public @interface SuppressWarnings { ... 

angegeben seine Bedeutung nicht mehr zur Laufzeit zur Verfügung stehen sollte. Dies bedeutet, dass sogar die Meta-Annotation-fähige Verarbeitung von Quellen sie nicht mehr sehen kann.

Wenn genügend Zeit zur Verfügung steht, können Sie einen Annotationsprozessor erstellen, der während der Kompilierungszeit eine benutzerdefinierte @ForMustache Annotation in eine @SuppressWarnings umwandelt, damit der Compiler sie aufnehmen kann. In ähnlicher Weise kann Lombok

@Data 
class Foo { 
    private final String value; 
} 

in einen Code) drehen, die zu einem Endfeld über keine Zuordnung kompiliert und nicht beschweren und b) würde es nicht eine Warnung erzeugen, weil es einen öffentlichen Getter für das Feld erzeugt, . Von diesen kann nur angenommen werden, dass sie von Orten verwendet werden, die außerhalb der Reichweite des Compilers liegen.

Neben der @SuppressWarnings überall, ist Ihre einzige Chance, die Bedingung zu entfernen, die die Warnung verursacht.

  • Deaktivieren Sie die Überprüfung mit einer Compiler-Option
  • public Getter oder anderen Code hinzufügen, damit die Felder (mit lombok zum Beispiel)
  • Haken in den Prozess der Kompilierung verwendet werden.
+0

Große Antwort!Ich habe die Möglichkeit erwogen, einen Annotationsprozessor zu schreiben, aber es scheint viel zu viel Aufwand für dieses Ziel zu sein. Vielen Dank für Ihre Vorschläge! –

Verwandte Themen