Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2006
    Messaggi
    103

    [JAVA] riflessione ed ereditarietà

    Ragazzi vi propongo un ulteriore esercizio proposto a lezione di cui però il terzo non sono proprio riuscita a capire come si fa. Ho dovuto inserire anche il testo dei due precedenti per chiarezza, ma è il terzo che mi crea problemi. In particolare vorrei capire come usare i valori che ho memorizzato in due strutture dati(una per le varie classi e una per il nome e valore degli attributi) per istanziare una nuova classe. Il prof. ci ha suggerito di usare newIstance(), ma questo metodo non prevede parametri mentre le mie classi hanno tutti diversi parametri...
    Grazie dell'attenzione

    Esercitazione di TPA del 4 aprile 2007-04-04
    La ACME produce mezzi di trasporto di tutti i tipi, dalle biciclette alle automobili. Per migliorare la qualità dei propri
    prodotti ha chiesto all’Università di Salerno di realizzare un simulatore universale che permetta di simulare qualsiasi veicolo.

    Primo Esercizio: Classi
    Il nostro primo compito è quello di realizzare il modello ad oggetti del simulatore, facendo in modo che qualsiasi categoria di veicolo sia utilizzabile nel simulatore senza che esso venga modificato ogni qualvolta viene introdotto un nuovo veicolo.
    Implementiamo in Java un modello a oggetti considerando che ogni veicolo ha i
    seguenti attributi in comune: Marca, Modello, NumRuote, Velocità, TipoCambio (Manuale o Automatico), Marcia, e che tutti i tipi di veicoli condividono le seguenti operazioni: cambiaMarcia( marcia: Intero ); frena(decelerazione: Intero);
    accelera (accelerazione: Intero).
    Inoltre forniamo anche l’implementazione delle classi Auto, Bici e Moto, introducendo in tali classi quegli attributi e quei metodi che sono specifici di tali veicoli.

    Secondo Esercizio: Introspezione
    Realizziamo una applicazione “Manager dei Veicoli”, che richiede in input il nome della classe di un veicolo e ne
    stampa le caratteristiche. Tale applicazione deve essere universale e quindi funzionare con qualsiasi tipo di veicolo,
    anche veicoli per i quali non esiste una classe nel momento della realizzazione del programma.
    Il programma dovrebbe somigliare il più possibile a quello riportato sotto:
     All’avvio visualizza l’intestazione “Manager Veicoli – Versione 1.0”;
     Richiedere all’utente il tipo del veicolo;
     Caricare dinamicamente la classe corrispondente al tipo specificato, e visualizzarne i metodi e gli attributi, o mostrare un messaggio di errore nel caso in cui tale classe non fosse disponibile.

    Manager Veicoli – Versione 1.0
    digitare il tipo di veicolo: Auto
    ***
    Attributi: Marca, Modello, NumRuote, Velocità, TipoCambio;
    Metodi: cambiaMarcia, frena, accelera;
    ***
    Digitare il tipo di veicolo: Aereo
    ^^^ Errore: il file Aereo.class non è stato trovato
    Digitare il tipo di veicolo:


    Terzo Esercizio: Ancora Introspezione
    Realizziamo una applicazione “Loader Veicoli” che istanzia tutti i veicoli elencati nel file di testo. Il file ha N righe,ogni riga ha il seguente formato: NomeClasse, NomeAttributo:Valore, NomeAttributo: Valore
    Se la classe non e presente, non viene istanziato niente. Alla fine del caricamento vengono elencati il tipo di oggetti caricati e il numero di oggetti caricati.

    Loader Veicoli – Versione 1.0
    *** istanziate le seguenti classi:
    Auto, Moto, Triciclo, Aereo per un totale di 4 istanze.
    Figura 3 – Loader Veicoli

  2. #2
    Per istanziare una classe con uno specifico costruttore, puoi fare così: chiami il metodo

    codice:
    getConstructor(Class[] parameterTypes)
    passandogli un array di oggetti Class corrispondente ai tipi dei parametri di input del costruttore.
    Ottieni così un oggetto di tipo Constructor sul quale puoi chiamare:

    codice:
    newInstance(Object[] initargs)
    passandogli l'array di valori dei parametri.

    Ciao,

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2006
    Messaggi
    103
    scusa l'ignoranza ma non ho ancora capito in che modo farlo... ma forse è meglio che ti scriva il mio codice così potrai aiutarmi meglio

    import java.io.*;
    import java.util.*;

    public class LoaderVeicoli {

    public static void main(String args[])throws Exception
    {
    System.out.println("Loader Veicoli - Versione 1.0");
    System.out.print("Inserisci il nome del file: ");
    BufferedReader console =new BufferedReader(new InputStreamReader(System.in));
    String nomeFile=console.readLine();//leggo da tastiera il nome del file Veicoli.txt


    ArrayList classi=new ArrayList();
    ArrayList attributi=new ArrayList();
    //apro il file
    BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream(new File(nomeFile))));

    String tupla=br.readLine();
    //ciclo per tutte le righe
    try{
    while(tupla!=null)
    {
    String[]campi=tupla.split(",");
    classi.add(campi[0]);//separo i vari campi della tupla e creo l'array solo delle classi
    System.out.println("La classe aggiunta all'array è:"+campi[0]);
    System.out.println();
    //devo leggere tutti gli attributi
    for(int i=1;i<campi.length;i++)
    {
    String[] valori=campi[i].split(":");
    attributi.add(new Attributo(valori[0],valori[1]));//prendo il nome e il valore degli attributi
    System.out.println("Il nome dell'attributo aggiunto all'array è:"+valori[0]);
    System.out.println("Il valore dell'attributo aggiunto all'array è:"+valori[1]);
    }
    Class classe=Class.forName(campi[0]);

    System.out.print("La classe istanziata è:"+classe.getName());
    System.out.println();
    //per leggere i nomi e i valori degli attributi
    /**
    * for(int j=0; j<attributi.size();j++)
    * {
    * Attributo a=(Attributo)attributi.get(j);
    * System.out.println("Nome Attributo:"+a.nome);
    * System.out.println("Valore Attributo:"+a.valore);
    * }
    */

    tupla=br.readLine();//va alla prossima riga
    }
    }
    catch(ClassNotFoundException e)
    {
    System.out.println("^^^ Errore il file class non è stato trovato");
    }
    }
    }
    come puoi vedere verso la fine ci sono dei commenti che ho aggiunto per ricordarmi come usare le informazioni che ho memorizzato in attributi ma non sono utili al programma.

  4. #4
    Utente di HTML.it L'avatar di nether
    Registrato dal
    Dec 2006
    Messaggi
    376
    1) visto che sai che le classi che andrai a istanziare estendono tutte Veicolo, ti conviene creare un array di Veicolo nel quale mettere dentro tutte le tue belle istanze...
    2) usa try solo dove e' necessario... nel tuo codice credo che l'unica eccezione da catchare sia quella sollevata da Class.forName().
    3) una volta che hai ottenuto la Class (come fai ora attraverso Class.forName()) e' il momento di istanziare concretamente un oggetto di quella classe: quindi nel tuo caso specifico dovresti fare
    codice:
    Veicolo v = classe.newInstance();
    ammesso che la classe disponga di un costruttore senza parametri, altrimenti devi fare come ha scritto interarete.
    4) ora che disponi di un'istanza concreta di Veicolo puoi settare i parametri. Se devi chiamare i metodi setter a partire dal loro nome, ti serve un oggetto Method per ogni parametro da settare.
    codice:
    Method setNome = classe.getMethod("set"+"Nome", String.class);
    setNome.invoke(v, "Alfa159");
    le stringhe coi nomi dei parametri e i rispettivi valori ovviamente li recuperi dal file, come gia' stai facendo mi pare

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2006
    Messaggi
    103
    infatti visto che dispongo di una interfaccia

    public interface IVeicolo {

    void cambiaMarcia(int nuovaMarcia);

    void frena(int decel);

    void accellera(int accel);
    }
    avevo provato a scrivere

    IVeicolo veicolo = (IVeicolo) classe.newInstance();
    ma mi dava errore evidentemente perchè le mie classi non hano un costruttore nullo...
    perciò dovrò usare il metodo di interarete, ma nello specifico non so se ho capito bene come fare...

  6. #6
    Utente di HTML.it
    Registrato dal
    May 2006
    Messaggi
    103
    sto provandola soluzione di nether che mi sembrava più facile.
    Ho aggiunto i costruttori nulli alle varie classi
    il codice l'ho così modificato:
    import java.io.*;
    import java.util.*;//per ArrayList e StringTokenizer

    public class LoaderVeicoli {

    public static void main(String args[])throws Exception
    {
    System.out.println("Loader Veicoli - Versione 1.0");
    System.out.print("Inserisci il nome del file: ");
    BufferedReader console =new BufferedReader(new InputStreamReader(System.in));
    String nomeFile=console.readLine();//leggo da tastiera il nome del file Veicoli.txt


    ArrayList classi=new ArrayList();
    ArrayList attributi=new ArrayList();
    //apro il file
    BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream(new File(nomeFile))));

    String tupla=br.readLine();
    //ciclo per tutte le righe
    try{
    while(tupla!=null)
    {
    String[]campi=tupla.split(",");
    classi.add(campi[0]);//separo i vari campi della tupla e creo l'array solo delle classi
    System.out.println("La classe aggiunta all'array è:"+campi[0]);
    System.out.println();
    //devo leggere tutti gli attributi
    for(int i=1;i<campi.length;i++)
    {
    String[] valori=campi[i].split(":");
    attributi.add(new Attributo(valori[0],valori[1]));//prendo il nome e il valore degli attributi
    System.out.println("Il nome dell'attributo aggiunto all'array è:"+valori[0]);
    System.out.println("Il valore dell'attributo aggiunto all'array è:"+valori[1]);
    }
    Class classe=Class.forName(campi[0]);
    IVeicolo veicolo=(IVeicolo)classe.newInstance();


    for(int j=0; j<attributi.size();j++)
    {
    Attributo attr=(Attributo)attributi.get(j);
    Method setNome = classe.getDeclaredMethod("set"+attr.nome, String.class);
    setNome.invoke(veicolo, attr.valore);
    }

    System.out.print("La classe istanziata è:"+classe.getName());
    System.out.println();


    tupla=br.readLine();//va alla prossima riga
    }
    }
    catch(ClassNotFoundException e)
    {
    System.out.println("^^^ Errore il file class non è stato trovato");
    }
    }
    }
    ora non compila dandomi errore nella linea di codice
    Method setNome = classe.getDeclaredMethod("set"+attr.nome, String.class);
    dov'è ora il problema?

  7. #7
    Utente di HTML.it L'avatar di nether
    Registrato dal
    Dec 2006
    Messaggi
    376
    credo che manchi l'import della classe java.lang.reflect.Method
    leggere gli errori no eh?

  8. #8
    Utente di HTML.it
    Registrato dal
    May 2006
    Messaggi
    103
    no purtroppo l'errore è (dopo aver importato la java.lang)

    Exception in thread "main" java.lang.Error: Unresolved compilation problems:
    The method getMethod(String, Class[]) in the type Class is not applicable for the arguments (String, Class)
    The method invoke(Object, Object[]) in the type Method is not applicable for the arguments (IVeicolo, String)

    at LoaderVeicoli.main(LoaderVeicoli.java:44)

  9. #9
    Utente di HTML.it
    Registrato dal
    May 2006
    Messaggi
    103
    questa è la mia ultima versione e credo che ora il problema sia solo il tipo dei parametri funziona solo con i tipi String

    import java.io.*;
    import java.util.*;
    import java.lang.reflect.Method;


    public class LoaderVeicoli {

    public static void main(String args[])throws Exception
    {
    System.out.println("Loader Veicoli - Versione 1.0");
    System.out.print("Inserisci il nome del file: ");
    BufferedReader console =new BufferedReader(new InputStreamReader(System.in));
    String nomeFile=console.readLine();//leggo da tastiera il nome del file Veicoli.txt


    ArrayList classi=new ArrayList();
    ArrayList attributi=new ArrayList();
    //apro il file
    BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream(new File(nomeFile))));

    String tupla=br.readLine();
    //ciclo per tutte le righe

    while(tupla!=null)
    {
    String[]campi=tupla.split(",");
    classi.add(campi[0]);//separo i vari campi della tupla e creo l'array solo delle classi
    System.out.println("La classe aggiunta all'array è:"+campi[0]);
    System.out.println();
    //devo leggere tutti gli attributi
    for(int i=1;i<campi.length;i++)
    {
    String[] valori=campi[i].split(":");
    attributi.add(new Attributo(valori[0],valori[1]));//prendo il nome e il valore degli attributi
    System.out.println("Il nome dell'attributo aggiunto all'array è:"+valori[0]);
    System.out.println("Il valore dell'attributo aggiunto all'array è:"+valori[1]);
    }
    try
    {
    Class classe=Class.forName(campi[0]);
    nomeClasse=classe.getName();

    IVeicolo veicolo=(IVeicolo)classe.newInstance();

    for(int j=0; j<attributi.size();j++)
    {
    Attributo attr=(Attributo)attributi.get(j);
    Class[] types = new Class[] {};
    types = new Class[] { String.class };

    Method setNome = classe.getDeclaredMethod("set"+attr.nome, types);
    setNome.invoke(veicolo, new Object[] {attr.valore});
    }
    }
    catch (ClassNotFoundException e)
    {
    System.out.println("^^^ Errore il file class non è stato trovato");
    }

    System.out.print("La classe istanziata è:"+nomeClasse);
    System.out.println();


    tupla=br.readLine();//va alla prossima riga
    }
    }
    public static String nomeClasse;
    }

  10. #10
    Utente di HTML.it
    Registrato dal
    May 2006
    Messaggi
    103
    qualcuno sa darmi una soluzione più universale??

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.