|
|
|
![]() |
|
Strumenti |
![]() |
#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 |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Sep 2007
Messaggi: 754
|
Class.forName(className);
__________________
http://www.tevigroup.it/ |
![]() |
![]() |
![]() |
#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. |
![]() |
![]() |
![]() |
#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%) |
![]() |
![]() |
![]() |
#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... ![]() |
![]() |
![]() |
![]() |
#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%) |
![]() |
![]() |
![]() |
#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 |
![]() |
![]() |
![]() |
#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: 07:18.