4 Stimmen

Java: Wie kann man eigene Compiler-Warnungen für Methodenverwendungen erzeugen?

Ich habe mich mit der Verarbeitung von Kommentaren beschäftigt, und es wäre wirklich hilfreich, den Benutzer vor der Verwendung bestimmter kommentierter Methoden warnen zu können. Dies ist im Grunde die Erstellung einer benutzerdefinierten Version der @Deprecated Bemerkung. Ich dachte, ein guter Anfang wäre der eigentliche Anmerkungsprozessor für @Deprecated aber ich kann sie nicht finden :_

(Beachten Sie, dass dies ähnlich, aber nicht gleichbedeutend ist mit Wie kann man absichtlich eine benutzerdefinierte Java-Compiler-Warnmeldung auslösen? )

Danke!

2voto

Bert F Punkte 81431

Denken Sie an einige der Warnungen bei der Code-Inspektion wie die Übergabe von null in eine varargs-Methode.

Sehen Sie sich für diesen Anwendungsfall die Checker Framework für vorhandene Prüfer (wie den Nullity Checker) und wie man benutzerdefinierte Prüfer (oder andere Prozessoren für Typkommentare) erstellt.

https://checkerframework.org/

Ich verwende dieses Tool und die dazugehörigen Prüfprogramme und bin sehr zufrieden damit.

Ohne genau zu wissen, was Ihnen vorschwebt, würde es mich nicht wundern, wenn einige der Prüfer bereits einige Ihrer Ideen aufgreifen. Möglicherweise können Sie einige steckbare Typen erstellen, um Ihre anderen Ideen umzusetzen. Zumindest könnte es Ihnen einige Ideen geben, wie Sie das, was Sie tun wollen, angehen können oder nicht.

1voto

Ben Punkte 369

Vielen Dank an alle für ihr Feedback. Ein Blick in die Compiler-API, es ist definitiv machbar (aber nicht so einfach). Dieser Artikel war ein guter Anfang für die Compiler-API. Ich denke, in Zukunft werde ich mich mit dem Schreiben eines erweiterbaren Regelprüfers beschäftigen. Der Versuch, die @Deprecated Annotation wird übrigens nicht funktionieren, da sie im Compiler zusammen mit den anderen "Platform Annotations" entfernt wird.

Im Moment wähle ich die eher grobe Lösung, den Programmierer mit einer ausführlichen geprüften Ausnahme zu erschlagen. Das macht den Code zwar unübersichtlich, vermeidet aber auch die Komplexität einer tatsächlichen Analyse der Absicht. Etwas wie:

try {
    doWork(workUnit, 15, Style.STRICT);
} catch (MakeSureYouOverrodeEverythingYouWantedToFirst warning) {
    ; // will never actually reach here, but you have been warned!
}

Wenn der Programmierer sich nicht an die Anweisungen hält, kann die Ausgabe seines Programms pseudozufällig fehlerhaft und daher ziemlich mühsam zu debuggen sein. Und obwohl diese Lösung sicherlich ein verpönter Hack der Ausnahmebehandlung ist (auch von mir), erfüllt sie ganz einfach meine Bedürfnisse.

Außerdem könnte der zusätzliche Aufwand den Programmierer dazu ermutigen, tatsächlich das zu tun, was er tun soll!

Ich bin immer noch daran interessiert, andere Ideen zu hören, wenn Sie eine haben.

-1voto

Peter Lawrey Punkte 511323

Der Annotationsprozessor befindet sich im javac, den Quelltext finden Sie in OpenJDK. Allerdings ist er nicht dafür ausgelegt, erweiterbar zu sein.

Besser ist es, Code-Analysen wie FindBugs oder PMD zu verwenden, da diese so konzipiert sind, dass sie erweitert werden können und Ihr Build fehlschlägt, wenn bestimmte Bedingungen nicht erfüllt sind.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X