| 
 | |||||||
| 
 | 
|  | 
|  | 
|  | Strumenti | 
|  23-10-2007, 17:36 | #1 | 
| Member Iscritto dal: Sep 2006 
					Messaggi: 207
				 | 
				
				[JAVA] invocare classi dinamicamente
			 
		Salve a tutti! vi espongo in parole semplici il mio problema. Supponiamo di avere un'applicazione, che legge da un file di testo un elenco di classi (ad esempio: Questa_classe1.class, Questa_classe2.class, Questa_classe3.class, ecc). Tutte queste classi contengono metodi ecc, che hanno un nome standard, che io conosco (ad esempio variabile1, funzione2(), ecc). La domanda è semplice: come faccio ad utilizzare questa classe? Ovvero, io voglio crearmi un oggetto di questa classe e poterne utilizzare le funzioni, i metodi, le variabili, ecc Sia chiaro che non conosco a priori il nome della classe, ma lo leggo dinamicamente. Ciò che conosco è il nome delle funzioni in esso contenute. Come si fa? Vi prego aiutatemi! se volete sarò più chiaro | 
|   |   | 
|  23-10-2007, 17:42 | #2 | 
| Senior Member Iscritto dal: Sep 2007 
					Messaggi: 754
				 | 
		Class.forName(className);
		 
				__________________ http://www.tevigroup.it/ | 
|   |   | 
|  23-10-2007, 17:59 | #3 | 
| Member Iscritto dal: Sep 2006 
					Messaggi: 207
				 | 
		Si già fatto.... mediante questo metodo ho la classe... come posso richiamare i costruttori e i metodi?? Esempio //file .txt classe1 classe2 classe3 ...... classe200 //CLASSE1 public class classe1{ public static int dd; public classe1(){} public String esegui(String kk){ .......... //CLASSE PRINCIPALE (essa richiamerà le classi presenti nel file .txt) public class Principale{ public static void main(String arg[]){ String hh; ............leggo da file la classe che mi serve e la memorizzo su hh Class c= Class.forName(hh); ............a questo punto mi servirebbe poter richiamare il metodo esegui dalla classe classe1 e passargli ad esempio la stinga ss, oppure richiamare la variabile statica dd, oppure richiamare il costruttore classe1.... come faccio??? postate un esempio casomai. GRAZIE. | 
|   |   | 
|  23-10-2007, 18:05 | #4 | 
| Senior Member Iscritto dal: Nov 2005 Città: TO 
					Messaggi: 5206
				 | 
		
Ti basta usare getMethod() di Class per avere un Method (devi chiaramente specificare i tipi dei parametri). Sull'oggetto Method chiami invoke() per invocare il metodo, specificando gli argomenti. Da notare che se il metodo da invocare è di "istanza", devi passare ad invoke() una istanza dell'oggetto su cui invocare il metodo, altrimenti il reference può anche essere null (tanto è ignorato). Ti basta leggere bene il javadoc. 
				__________________ Andrea, SCJP 5 (91%) - SCWCD 5 (94%) | 
|   |   | 
|  23-10-2007, 18:10 | #5 | 
| Member Iscritto dal: Sep 2006 
					Messaggi: 207
				 | 
		Magari potresti farmi un esempio modificando quello stesso che ho postato.. così capisco dove sto sbagliando... GRAZIE...   | 
|   |   | 
|  23-10-2007, 18:25 | #6 | 
| Senior Member Iscritto dal: Nov 2005 Città: TO 
					Messaggi: 5206
				 | Codice: import java.lang.reflect.*;
public class Prova
{
    public static void main (String[] args)
    {
        try
        {
            Class<Prova> c = Prova.class;
            Method m = c.getMethod ("unMetodo", int.class, long.class);
            Prova obj = new Prova ();
            m.invoke (obj, 10, 20L);
        }
        catch (Exception e)
        {
            System.out.println (e);
        }
    }
    public void unMetodo (int a, long b)
    {
        System.out.println (a + " " + b);
    }
}Per il resto, come vedi, si tratta di 4 istruzioni in croce. 
				__________________ Andrea, SCJP 5 (91%) - SCWCD 5 (94%) | 
|   |   | 
|  23-10-2007, 18:32 | #7 | 
| Member Iscritto dal: Sep 2006 
					Messaggi: 207
				 | 
		Prova obj = new Prova (); io non conosco la classe dove ci sono i metodi da richiamare... quindi nn posso usare questo.... magari potresti riprendere il mio esempio così capisco??? GRAZIE | 
|   |   | 
|  23-10-2007, 18:43 | #8 | 
| Senior Member Iscritto dal: Nov 2005 Città: TO 
					Messaggi: 5206
				 | 
		
Se il metodo è di istanza devi chiaramente creare una istanza della classe. Codice: import java.lang.reflect.*;
public class Prova
{
    public static void main (String[] args)
    {
        try
        {
            Class<?> c = Class.forName ("UnaClasse");
            Method m = c.getMethod ("unMetodo", int.class, long.class);
            Object obj = c.newInstance ();
            m.invoke (obj, 10, 20L);
        }
        catch (Exception e)
        {
            System.out.println (e);
        }
    }
}
class UnaClasse
{
    public void unMetodo (int a, long b)
    {
        System.out.println (a + " " + b);
    }
}
				__________________ Andrea, SCJP 5 (91%) - SCWCD 5 (94%) | 
|   |   | 
|   | 
| Strumenti | |
| 
 | 
 | 
Tutti gli orari sono GMT +1. Ora sono le: 11:40.









 
		 
		 
		 
		








 
  
 



 
                        
                        










