2012-06-15 13 views
10

Tra Java 5 e Java 6, le regole relative alle annotazioni @Override per i metodi che hanno origine nelle interfacce (al contrario delle superclassi) sono state modificate, prima che non fossero consentite, ma dopo lo erano. Tuttavia, non sono richiesti da javac.Come posso rilevare staticamente le annotazioni @Override mancanti?

Alcuni IDE, come Eclipse, possono generare errori o avvisi per tali sostituzioni mancanti. Sto cercando qualsiasi tipo di strumento di analisi statica in grado di rilevare le sostituzioni mancanti, quindi posso segnalarle/bloccarle a livello di codice.

Non sembra come qualsiasi di quelle più grandi io sappia come findbugs, et al può farlo - probabilmente perché @Override ha solo livello di ritenzione fonte, quindi non è presente in file .class sul quale questi strumenti operare e gli strumenti a livello di sorgente come checkstyle non comprendono la gerarchia di classi completa.

+0

Quando invoco il checkstyle non c'è posto per un classpath. Questo va bene per i controlli stile, ma come dovrebbe sapere checkstyle il mio 'void doStuff()' sovrascrive il metodo 'void doStuff()' senza avere le tue classi (nel percorso di origine o in classpath). – emory

+0

Sì, esattamente, a prescindere dal problema di conservazione del runtime, checkstyle sta semplicemente eseguendo verifiche "locali" su un file e probabilmente non è stato possibile rilevarlo. – BeeOnRope

+0

Non capisco perché la ritenzione sia un problema. Il correttore avrà bisogno di accedere al tuo codice sorgente e ai file di classe delle tue dipendenze. Non avrà bisogno di accedere al codice sorgente delle tue dipendenze. (Se nel codice sorgente manca '@ Sovrascrivi 'nel codice sorgente che non si dispone dei privilegi di scrittura, cosa farebbe?) – emory

risposta

3

È possibile abilitare un'azione di salvataggio in Eclipse per aggiungere automaticamente l'annotazione @Override mancante. Vedere Finestra> Preferenze> Java> Editor> Salva azioni> Codice mancante> Aggiungi annotazioni mancanti.

+0

Sì, ma il problema è in un ambiente con molti IDE diversi e ambienti di sviluppo non IDE, non è possibile garantire a tutti di farlo. Il mio obiettivo è rilevare i casi in cui mancano, non modificare gli strumenti di sviluppo esistenti per garantire che manchino di meno. – BeeOnRope

+0

Bene, nella domanda si dice "per impedire loro di entrare nel nostro codice base in primo luogo". Quindi non sono sicuro di quello che vuoi. –

+0

Tale controllo può essere eseguito in un sistema di "pre-controllo" che convalida la fonte prima che entri nel repository principale di origine. In ogni caso, quella parte non è veramente rilevante quindi la rimuoverò/chiarirò. Ho solo bisogno di uno strumento automatico in grado di rilevare questi problemi. – BeeOnRope

1

Ovviamente è necessario qualcosa che elabora il codice sorgente Java e consente di accedere alle strutture del codice e agli attributi.

Comprendo che Eclipse ha alcuni meccanismi di analisi in JDT e potrebbe essere possibile utilizzarlo.

Il nostro software DMS Reengineering Toolkit include un parser Java completo (inclusa l'acquisizione degli attributi), il nome completo e la risoluzione del tipo e la possibilità di leggere molti file sorgente contemporaneamente. DMS è progettato per consentirti di creare il tuo strumento di analisi personalizzato, in modo da poter definire le condizioni in base alle quali insisti che gli attributi siano presenti o meno.

Poiché DMS offre anche capacità di trasformazione del programma, è possibile anche definire regole di personalizzazione che modificano il codice sorgente dove è chiaro quali attributi devono essere presenti.

DMS e le regole dei linguaggi Java non sono banali da apprendere; questo richiede un po 'di sforzo per configurare. Ma se hai davvero migliaia di sviluppatori, questo costo è sommerso dall'incapacità di controllare ciò che stanno facendo, quindi l'investimento ha un senso.

0

JArchitect Potrebbe risolvere il problema utilizzando CQLinq e richiesta exceute come questo

da t in Tipi dove! T.HasAnnotation ("Override") selezionare t

E naturalmente si può personalizza la tua query come preferisci per aggiungere altri criteri.

Problemi correlati