View Full Version : [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
isAlreadyInUse
23-10-2007, 16:42
Class.forName(className);
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.
a questo punto mi servirebbe poter richiamare il metodoTi 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.
Magari potresti farmi un esempio modificando quello stesso che ho postato..
così capisco dove sto sbagliando...
GRAZIE...:)
Magari potresti farmi un esempioimport 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);
}
}
L'unica cosa particolare che ti segnalo è che io ho usato quello che si chiama "class literal" che è quel Prova.class per ottenere la classe. Nel tuo caso dovrai usare Class<?> c = Class.forName(.....)
Per il resto, come vedi, si tratta di 4 istruzioni in croce.
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
Prova obj = new Prova ();
io non conosco la classeSe il metodo è di istanza devi chiaramente creare una istanza della classe.
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);
}
}
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.