Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it L'avatar di Reiuky
    Registrato dal
    Jul 2008
    Messaggi
    371

    parametrizzare il nome di una classe

    Nuova settimana nuovo problema... Per fortuna le ferie sono vicine

    Devo chiamare un metodo (static) di una classe da un'altra classe.
    In particolare il metodo è il metodo main, e non c'è bisogno che istanzi la classe.

    scrivere

    NomeClasse.main( {lista di parametri} );

    funziona. Però il nome della classe da chiamate è diverso da cliente a cliente. Fanno tutte la stessa cosa, ma hanno tutte nomi diversi.

    Mi chiedevo se fosse possibile parametrizzare il nome della classe, ovvero, passarlo come parametro alla classe che stò facendo io.

    (Non è indispensabile... si può creare un programma per ogni cliente in cui si cambia di volta in volta il nome della classe incriminata. Ma se si potesse fare, sarebbe una bella comodità, perché il programma compilato sarebbe uno, e si andrebbe a modificare solo il .bat che chiama la mia classe)

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,326
    Puoi dare un'occhiata al metodo forName() della classe Class (un esempio tipico del suo utilizzo è quello dei Driver JDBC per i database).


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it L'avatar di Reiuky
    Registrato dal
    Jul 2008
    Messaggi
    371
    Potresti, per favore, passarmi un esempio?

    Non mi ci stò trovando proprio.....

  4. #4
    la problematica si chiama "reflection". Se cerchi parole come java reflection trovi una marea di esempi.

    C'è anche un articolo su html.it al riguardo: http://java.html.it/articoli/leggi/2...ction-in-java/
    Ivan Venuti
    Vuoi scaricare alcuni articoli sulla programmazione, pubblicati su riviste di informatica? Visita http://ivenuti.altervista.org/articoli.htm. Se vuoi imparare JavaScript leggi il mio libro: http://www.fag.it/scheda.aspx?ID=21754 !

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,326
    Un esempio per istanziare un oggetto di una classe chiamata "MiaClasse", ad esempio, è questo:
    codice:
    Object mioOggetto = Class.forName("MiaClasse").newInstance();
    Ovvio che non conoscendo a priori il tipo di oggetto non puoi "lavorarci su facilmente".

    Dovrai, ad esempio, utilizzare la Reflection. Un esempio che lancia il metodo main() di un oggetto che non richiede parametri nel costruttore:
    codice:
    import java.lang.reflect.*;
    
    public class Avvia {
       public static void main(String[] args) throws Exception {
          Class[] params = { args.getClass() };
          System.out.println("Avvio la classe Tester: ");
          Object obj = Class.forName("Tester").newInstance();
          Method m = Class.forName("Tester").getMethod("main", params);
          Object[] pars = { args };
          m.invoke(obj, pars);
       }
    }
    Domanda: ha proprio senso andarsi a complicare in questo modo la vita, quando risolvi tutto con un BAT personalizzato, che comunque dovrai creare per passare al programma in nome della classe da avviare?


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  6. #6
    Utente di HTML.it L'avatar di Reiuky
    Registrato dal
    Jul 2008
    Messaggi
    371
    Grazie.

    Sono riuscito a mettere insieme questo spaccato di codice

    codice:
            try
    	{
    		Class c = Class.forName( "NomeClasse" );
    		Method metodi[] = c.getDeclaredMethods();
    		Object[] par  = {parametri1};
    
    		for (int i=0; i<metodi.length; i++)
    		{
    			if(metodi[i].getName().equals("main"))
    			{
    				metodi[i].invoke(c.newInstance(), par);
    				break;
    			}
    		}
    	}
    Ma, quando provo a eseguirlo ottengo

    java.lang.IllegalAccessException: Class gestione.FirmeRaMain can not access a member of class it.racomputer.twsign.traduttore.MCRF0169 with modifiers "private"

    che significa?

  7. #7
    Utente di HTML.it L'avatar di Reiuky
    Registrato dal
    Jul 2008
    Messaggi
    371
    Non avevo visto il tuo messaggio

    Adesso provo come hai suggerito tu ^___^

    Domanda: ha proprio senso andarsi a complicare in questo modo la vita, quando risolvi tutto con un BAT personalizzato, che comunque dovrai creare per passare al programma in nome della classe da avviare?


    Ciao.
    Fosse stato per me, mi sarei limitato a fare un .bat abbastanza completo che fa tutto lui... O avrei fatto la classe chiamata un po' più generica.

    Ma, come ultimo arrivato in ditta, devo starmene zitto e lavorare ^______________^

  8. #8
    Utente di HTML.it L'avatar di Reiuky
    Registrato dal
    Jul 2008
    Messaggi
    371

    Risolto

    Ho chiesto al capo di poter tenere fisso il nome della classe, e lui ha detto che si può fare. Che bello ^___^

    Comunque, grazie infinite per l'aiuto

  9. #9
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,326
    Diciamo che, se si vuole fare una cosa carina, si può sfruttare il polimorfismo.
    Si crea una classe astratta (diciamo Cliente) con un metodo astratto esegui().

    A quel punto, per ogni cliente avrai una classe personalizzata (ad esempio ClienteRossi) che implementa a dovere il metodo esegui().
    Ecco la situazione:
    codice:
    public class ClienteRossi extends Cliente {
       ...
       // La firma del metodo esegui() è puramente inventata
       // L'ho lasciata come il metodo main(), ma nessuno vieta di farne una personalizzata
       public void esegui(String[] args) {
          ...
       }
    }
    Avendo questa situazione è pensabile senza troppo sforzo di creare una classe unica che faccia da esecutore, prendendo il nome della classe come parametro String, senza dover ricorrere alla Reflection:
    codice:
    public void main(String[] args) {
       Cliente cl = (Cliente) Class.forName( args[0] ).newInstance();
       cl.esegui();
    }
    PS: E' anche possibile (e forse più elegante) far sì che Cliente sia un'interfaccia piuttosto che una classe astratta, ma questo dipende poi dall'effettivo sviluppo.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  10. #10
    Utente di HTML.it L'avatar di Reiuky
    Registrato dal
    Jul 2008
    Messaggi
    371
    Hai pienamente ragione: così è molto più carino.

    ^____^

    Grazie ancora ^_^

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.