Newsgroup: it.comp.java
Titolo: newInstance con parametri

Salve a tutti.
E' un po' di tempo che uso il ng come help trovando sempre le risposte
giuste, stavolta però mi sono arenato.
Dovrei istanziare un nome classe che trovo in un record di un file
passandogli dei parametri.
Ho trovato una risposta inerente di Daniele Piras, ma non mi ci racapezzo:
qualcuno potrebbe postarmi due righe di codice?
Cito testaulmente:
--------------------------------------------------
Se vuoi richiamare il costruttore di default basta che invochi il metodo
newInstance()
Se invece vuoi richiamare un costruttore che magari possiede dei parametri
allora il modo è un pò più complicato.
Infatti devi reperire l'oggetto Constructor associato al tuo costruttore
specifico (una classe può avere più costruttore quindi devi richiamare
proprio quello che ti serve).
Per ottenere l'oggetto Constructor:
- o utilizzi la getConstructors() che ti restituisce un vettore di oggetti
Constructor  poi ciclando in questo vettore e,  controllando il parametri
di
ingresso (tramite il metodo getParameterTypes)  trovi quello che fà al caso
tuo
- o utilizzi la getConstructor() passandogli come parametro un vettore di
oggetti Class a cui devono corrispondere i parametri del costruttore
Una volta reperito l'oggetto Constructor invochi su tale oggetto la
newInstance() passandogli come parametro un vettore di Object contenente i
vari oggetti che devi passare come parametri del costruttore (in posizione
0
del vettore il primo parametro, in posizione 1 il secondo parametro e così
via)
e il gioco è fatto!
Ciao ciao
Dani
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

Scusate: ho poche idee e ben confuse.
Sto provando cosě, e manco mi si compila:
		Class classeP01 = Class.forName(classeBottone[0]);
		Class classeP02 = Class.forName(classeBottone[1]);
		Class classeP03 = Class.forName(classeBottone[2]);
		Class classeP04 = Class.forName(classeBottone[3]);
		Class classeP05 = Class.forName(classeBottone[4]);
		Class classeP06 = Class.forName(classeBottone[5]);
		Class classeP07 = Class.forName(classeBottone[6]);
		Class classeP08 = Class.forName(classeBottone[7]);
		Class classeP09 = Class.forName(classeBottone[8]);
		Class classeP10 = Class.forName(classeBottone[9]);
 
		Object test=evt.getSource();
		if (test==p01) {
				new classeP01(connessione,utente);
			}
		if (test==p02) {
				new classeP02(connessione,utente);
			}
Eccetera
classeBottone č un array di stringhe il cui contenuto ovviamente sono
delle classi. Queste classi sono di tipo JFrame.
C'č qualche anima pia? :o)))



Il problema che hai esposto riccalca il pattern Factory.
Seguilo e otterrai codice più robusto e facile da manuntenere e 
soprattutto che ricalca uno standard.
Per la doc su cosa sia il pattern Factory (e tutti i pattern design) 
cerca su google e troverai un sacco di roba.
Ciao
Fabio Ambrosanio

 Fabio Ambrosanio
Ciao
Massimiliano


Sto provando cosě, e manco mi si compila:
[CUT]
Ok, potresti almeno dire che errori riporta il compilatore :-)
Comunque prova a vedere... la migliore "anima pia" ;-)
http://java.sun.com/docs/books/tutorial/reflect/object/arg.html
HTH
-- 
Ciao
	Fabrizio C.

 
http://java.sun.com/docs/books/tutorial/reflect/object/arg.html
Mi rendo conto che probabilmente non era così semplice come volevo farla
io.
Dunque io il punto (1) l’ho fatto e ho creato la classe, o meglio, le
classi:
Class classeP01 = Class.forName(classeBottone[0]);
Class classeP02 = Class.forName(classeBottone[1]);
ecc.
Ora dovrei creare un array di classi come recita il punto (2), ma
guardando l’esempio mi perdo.
Cosa vuol dire “int.class”? Class è un metodo della classe int? No, perché
int non è una classe …
Class[] intArgsClass = new Class[] {int.class, int.class};
Questo array di classi vedo poi che lo usa solo per passarlo al
getConstructor come parametro.
Mi sembra di intuire però, che se io ho un solo costruttore potrei
fregarmene di passargli i parametri per selezionare un specifico
costruttore, giusto? Ne ho uno solo quindi non devo selezionare niente, o
sì?
Ultima domanda: alla fin fine, l’istruzione sostitutiva di :
Rectangle rectangle = new Rectangle(12, 34);
è la riga:
object = constructor.newInstance(arguments);
In pratica, se ho capito bene "newistance del costruttore" = "new della
classe", giusto?
Grazie per la pazienza dimostrata finora.
Ho fatto un corso di 5 giorni ma mi rendo conto che era troppo poco. E’
dura senza nessuno sottomano che ti dà la dritta giusta. Fortuna che c’è
il ng :o)))


 
Ciao,
Visto che hai nominato un mio post ... ho pensato di creare un piccolo 
esempio che facesse vedere quello che intendevo...
Spero possa esserti utile!
Ciao 
Daniele
(p.s. Fai attenzione che il codice non è ottimizzato potevo fare delle 
piccole migliorie ma prendilo solo come ESEMPIO :-) )
package test;
import java.lang.reflect.*;
/**
  Classe d'esempio per invocare un costruttore con parametri tramite
  l'utilizzo della reflection.
*/
public class ConstructorTest
{
        // Esempio costruttore con due parametri ...
        public ConstructorTest(String s, Integer i)
        {
                System.out.println(
                        "Costruttore invocato con parametri : Stringa " + s + " Integer " + i);
        }
 
        public static void main(String[] args) throws Exception
        {
                // Reperisco tramite la reflection la classe dell'oggetto ...
                Class c = Class.forName("test.ConstructorTest");
 
                Class paramsType[] = new Class[2];   // Vettore con il TIPO dei parametri  
                Object values[] = new Object[2];     // Vettore con i VALORI dei parametri
 
                // Definisco i parametri da passare ...
                values[0] = new String("Hello World!");
                values[1] = new Integer(10);
    // Ne prelevo il tipo ...
                paramsType[0] = (values[0]).getClass();
                paramsType[1] = (values[1]).getClass();
    // Restituisce il costruttore assocciato alla lista dei parametri data 
                Constructor myConst = c.getConstructor(paramsType);
                if (myConst != null)
                {
                        // Creo l'istanza 
                        myConst.newInstance(values);
                }
        }
}

                         myConst.newInstance(values);
E' tutto perfettamente chiaro, tranne quest'ultimo passaggio. Il metodo
newInstance della classe Constructor è di tipo Object: per creare
l'istanza non bisogna assegnare il tutto a un qualcosa di tipo object???
Parlo in teoria.
In pratica a me non si compila il seguente codice (ho tratto ispirazione
da quel che mi hai dato:
Object[] parametri= new Object[] {connessione, utente};
 
		Object test=evt.getSource();
		Class paramsType[] = new Class[2]; // Vettore con il TIPO dei parametri 
		paramsType[0] = (parametri[0]).getClass();
		paramsType[1] = (parametri[1]).getClass();
 
		if (test==p01) {
			Class classeP01 = Class.forName(classeBottone[0]);
			Constructor costruttoreP01=classeP01.getConstructor(paramsType);
			costruttoreP01.newIstance(parametri);
			}
Mi dice esplicitamente:
C:\Massimiliano\Java\As400\As400.java:147: cannot resolve symbol
symbol  : method newIstance (java.lang.Object[])
location: class java.lang.reflect.Constructor
			costruttoreP01.newIstance(parametri);
La classe contenuta nella stringa classeBottone[0] è di tipo JFrame: come
posso fare per istanziarla???
Abbiate pietà: "so' de coccio", come dicono i romani ...
(tra parentesi ho provato anche la strada del getConstructors, tanto di
costruttori ne ho uno solo, ma mi sono arenato sempre al momento di
istanziare).


 costruttoreP01.newIstance(parametri);
[CUT]
Attento! .. hai scritto newIstance invece che newInstance.Il compilatore 
ovviamente ti segnalava il fatto che tale metodo non esiste (e 
giustamente!)
Ciao ciao
Daniele

 symbol  : method newIstance (java.lang.Object[])
newI_N_stance() :-)
-- 
Life's something u don't get out alive..
ObjectZone - 
http://space.tin.it/computer/csadun

classe", giusto?
Sì. Anche se è una definizione un po' tagliata con l'accetta ;-)
Comunque l'esempio nuovo di Piras è illuminante... :-D


 Daniele
Grazie mille!!!


 Daniele
Grazie mille!!!


 newI_N_stance() :-)
Ehm ... :o)))
Grazie mille.


Grazie a tutti per la pazienza dimostrata ad un povero niubbi :o)
Spero di non incastrarmi più così ...
Ciao
Massimiliano
