Domanda

Il problema è il seguente:

C'è una base di codice massiccia in Java (centinaia di file in decine di pacchetti) in cui dobbiamo la possibilità di aggiungere e rimuovere la parola chiave strictf in ogni definizione di classe. Ho in programma di utilizzare sed o awk per eseguire questa sostituzione. Tuttavia, vorrei evitare la parola "classe" nei commenti o altrove di essere sostituito. Qualcuno può pensare a una soluzione per questo?

È stato utile?

Soluzione

Dal momento che si desidera passare avanti e indietro tra strictf e non strictf, può essere un'idea migliore per modificare i file .class come parte del processo di generazione. Poi si può fare questa scelta l'opzione di compilazione e accenderlo senza cambiare costantemente file di origine.

Altri suggerimenti

A tale impegno, desidero innanzitutto raccomandare scrivendo un piccolo programma che verifica tutti i file *.class in un albero in realtà hanno (o non hanno) l'impostazione strictfp corretta. Quindi, qualunque cosa si sceglie di fare per risolvere il problema modifica del codice sorgente, è possibile eseguire il controllo dopo che il compilatore per assicurarsi che hai fatto la cosa giusta.

Questo è in realtà solo TDD applicato al vostro problema particolare.

Come standard è la formattazione del codice? Per esempio, si potrebbe cercare di 'classe' in una linea che termina con { o dove la riga successiva inizia con { o qualcosa del genere?

Non c'è modo di essere certi di ottenere questo diritto al 100% senza un parser Java. Ma, ciò che segue può essere abbastanza vicino:

sed -i.bak 's/\\(public\\|private\\|protected\\)\\(.*\\)class/\\1 strictfp \\2 class/g' $file

Credo di aver preso le fughe giuste, ma sto scrivendo questo da una macchina Windows e non l'ho testato.

È possibile che questo sarà inciampare se avete commenti con 'pubblico / privato / protetta' seguito da 'classe'.

Come un completo catch-all, no, non c'è RegEx per questo. Faresti essenzialmente bisogno di scrivere un interprete Java (o almeno un parser) al fine di tenere conto di qualsiasi costruzione teorica di una classe. Detto questo, si dovrebbe essere al sicuro se la classe parola è il primo bit non-spazi bianchi sulla linea, o se è preceduta da un modificatore di accesso che è il primo bit non-spazi bianchi sulla linea.

Mi vengono in mente due possibilità:

  • Utilizzare un parser, piuttosto che un'espressione regolare (FER non sono destinato a tutto ). Un parser sarà di gran lunga migliore comprendere la sintassi del linguaggio.
  • Fai la tua base di codice costante in modo che non sarà raccogliere erranti stringhe "di classe".

Nessuno di questi sono molto soddisfacenti. Il primo è in realtà molto difficile da scrivere, il secondo difficile da ottenere.

Il mio consiglio sarebbe quello di trovare solo un RE e accenderlo sciolto su una copia locale del codice sorgente, quindi esaminare tutte le modifiche. Qualunque siano le modifiche che sono state fatte per errore, modificare il RE e riprovare.

Poi introdurre standard di codifica e gradualmente cambiare tutte le definizioni non conformi per essere corretta.

Starblue: Grazie! Da alzando BCEL, ho trovato JMangler, che è perfetto, dato che posso modificare i file esistenti .class per aggiungere il modificatore strictf. http://javalab.cs.uni-bonn.de/ ricerca / jmangler / tutorial / using.html

Giusto per far sapere alla gente, ho deciso di andare con Javassist alla fine, invece di BCEL, dal momento che Javassist sembra essere molto più semplice da usare ed è perfettamente adeguata per i miei scopi. http://csg.is.titech.ac.jp/~chiba/javassist . Nel caso in cui qualcuno è curioso, il codice sarebbe andare qualcosa come questo:


    import javassist.*;
    ClassPool cp = new ClassPool(); 
    CtClass someClass = cp.get("SomeClass"); 
    someClass.setModifiers(Modifier.STRICT);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top