PDA

View Full Version : [JAVA] invocare classi dinamicamente


x-t
23-10-2007, 16:36
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);

x-t
23-10-2007, 16:59
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.

andbin
23-10-2007, 17:05
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.

x-t
23-10-2007, 17:10
Magari potresti farmi un esempio modificando quello stesso che ho postato..
così capisco dove sto sbagliando...
GRAZIE...:)

andbin
23-10-2007, 17:25
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.

x-t
23-10-2007, 17:32
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

andbin
23-10-2007, 17:43
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);
}
}