Newsgroup: it.comp.java
Titolo: Creare una classe on-the-fly

Sto scrivendo un programma in java di tipo application (stand-alone)
nel menu' iniziale l' utente sceglie quale form aprire e li ho creato una switch
del tipo
	case 1: x = new Class1
	case 2: y = new Class2
	etc. etc etc.
io vorrei collocare i nomi delle classi (che sono extends decoratedframe) in un
array e fare uuna cosa tipo
	new Form[x]
	Ho visto che c'e' la possibilita con Class.forname("Form1") ma non so
bene come usarlo.
 
	Per specificare meglio, "Form1" e "Form2" sono tutte e due classi
extends di decoratedframe ma hanno proprieta' differenti, campi differenti etc.
come posso fare ?


| --
| Bruno Bossola
| Groupware/Intranet B.U.           Phone:  +39-11-2252211
| ATOS SpA v.Vaninetti 27           Fax:    +39-11-2203182
| I-10148 Torino ITALY              Change NOSPAM in atos to email me!

Ciao,
	una classe in Java e' un oggetto come un altro, e quindi puoi
tranquillamente conservarlo in un array:
Class[] classes = new Class[3];
classes[0] = class.forName("java.awt.Frame");
classes[1] = class.forName("java.awt.Dialog");
classes[2] = class.forName("java.awt.Window");
 
	Quando usi la class.forName() devi solo ricordarti di
referenziare completamente la classe.
	Successivamente, per istanziare un oggetto di una classe il
cui nome e' conosciuto solo a runtime esiste un metodo molto semplice,
utilizzabile pero' solo se il tuo oggetto ha un costruttore vuoto:
Object o = Class.forName(className).newInstance();
	Se sfortunatamente non hai un costruttore vuoto, sei costretto
ad usare Reflection. Ad esempio, se la tua classe ha un costruttore
che accetta come parametro una stringa, puoi scrivere:
// trova il costruttore
Class c = Class.forName(className);
Class[] paramTypes = new Class[1];
paramTypes[0] = Class.forName("java.lang.String");
Constructor creator=c.getConstructor(paramTypes);
// instanzia l'oggetto con il costruttore new Object(String)
Object[] paramValues = new Object[1];
paramValues[0] = getInstanceName(objectName);
obj=creator.newInstance(paramValues);
	Una volta che hai istanziato gli oggetti, pero', gestirli e'
un tuo problema! Il metodo instanceof ti puo' servire per distinguere
la classe di un oggetto:
if (obj instanceof java.awt.Frame)
{
    MenuBar mb = ((Frame)obj).getMenuBar();
    ; // bla bla
}
else if (obj instanceof java.awt.Dialog)
{
    boolean modal = ((Dialog)obj).isModal();
    ; // bla bla
}
else
; // bla bla
...ed anche il metodo getClass() di Object puo' servire allo scopo.
	Scusa se magari ti ho detto cose che gia' sapevi, ma la
domanda era un po' nebulosa... Comunque, se hai altri dubbi, posta sul
NG!


 extends di decoratedframe ma hanno proprieta' differenti, campi
differenti etc.
Questo non e' un problema per la creazione degli oggetti, poiche'
in ogni caso i riferimenti possono essere tenuti in un riferimento alla
base comune fra le classi; questo funzionera' alla perfezione se
tutte le chiamate che fai su questo riferimento sono polimorfiche,
cioe' di metodi che le classi ereditano da quella base.  Se invece
devi fare cose diverse a seconda del tipo di oggetto, puoi: con
approccio OO, definire una base comune che _abbia_ tutti i metodi
che ti servono, magari abstract, e implementati differentemente nelle
varie classi concrete; oppure, si torna al deprecabile switch, nel qual
caso non vale probabilmente la pena di "OO-izzare" la sola creazione
degli oggetti.
Alex