Come effettuare il merging delle proprietà

Capita spesso di dover configurare delle proprietà della Java Virtual Machine affinché le nostre applicazioni girino in maniera appropriata: ad esempio jdbc.drivers (per specificare la classe del driver JDBC da utilizzare, ad esempio "sun.jdbc.odbc.JdbcOdbcDriver") oppure parametri tipici della nostra applicazione, come la stringa JDBC per effettuare la connessione (ad esempio "jdbc:odbc:miodb"). Tipicamente, questo compito viene assolto in due modi:
Tip fornito dal sig. G.Guarnieri.

1) Specificando i valori direttamente nel codice, usando ad esempio

   Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

   ciò comporta lo svantaggio che per modificare il valore del parametro
   occorre ricompilare, con effetti negativi sulla manutenibilità e
   riusabilità   del codice;

2) Passare il parametro sulla riga di comando come in:

   java -Djdbc.drivers=sun.jdbc.odbc.JdbcOdbcDriver MiaClasse

In questo modo però si obbliga l'utente a dover ricordare una stringa    molto lunga e poco intuitiva per il lancio dell'applicazione oppure si è tenuti a costruire degli script di shell (dipendenti quindi dal  sistema operativo) per far partire il programma.
Un modo più “pulito” per risolvere ambedue i problemi può essere quello di spostare la definizione delle proprietà in un file ".properties", in modo da poterlo facilmente editare con qualunque editor di testo, e mescolare queste proprietà a quelle di sistema durante l'avvio della nostra applicazione. Ecco un metodo che effettua proprio l'operazione di merging delle proprietà:

private static void mergeProperties(String propFile) {
    Properties p = new Properties(System.getProperties());

    try {
        p.load(MiaClasse.class.getResourceAsStream(propFile));
        System.setProperties(p);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

in cui:

•	MiaClasse rappresenta il nome della classe di cui il metodo mergeProperties fa parte; 
dovrebbe essere la classe principale dell'applicazione (quella col metodo "main", per intederci)

•	propFile è il nome del file ".properties" creato precedentemente, che deve trovarsi nella stessa cartella del file"MiaClasse.class"

il metodo mergeProperties deve essere il primo richiamato nel main, per far si che ogni altra azione che richieda un valore di proprietà lo trovi opportunamente impostato:

public static void main(String[] argv) {
   MiaClasse.mergeProperties("NomeDelFileDiProprieta.properties");
   ...
}

Un po' di Reflection all'opera.

Due classi che dato il nome di una classe, passato come argomento completo di package (per esempio provate la java.lang.String), mostrano gli attributi, i costruttori e i metodi da questa contenuta, oltre al package di appartenenza, eventuali interfacce implementate e classe estesa. Le due classi si differenziano nel fatto che la seconda estrae la lista dei parametri dei metodi e dei costruttori, e non si limita a visualizzarne la dichiarazione (cosa che fa la prima classe).
Trovate l’applicazione completa su: www.itportal.it/ioProg70/Tips o sul supporto CD-Rom allegato alla rivista \Tips
Tip fornito dal sig. M.Catena