Newsgroup: it.comp.java
Titolo: Reflection

Scusate se insisto: ho provato a isolare il problema con due classi di
esempio banali. Posto qui sotto le due classi e il risultato sulla shell
del DOS.
Perché non funzionano???
--------------------------------------
import java.lang.reflect.*;
class Es1{
	public static void main(String a[]) {
		String stringa="Massimiliano";
		Integer numero=new Integer(66);
		Object[] parametri= new Object[2];
		parametri[0]= stringa;
		parametri[1]= numero;
 
		Class paramsType[] = new Class[2]; // Vettore con il TIPO dei parametri 
		paramsType[0] = (parametri[0]).getClass();
		paramsType[1] = (parametri[1]).getClass();
		try {
			System.out.println("Class classeP01 = ");
			Class classeP01 = Class.forName("Es1Chiamata");
			System.out.println("Constructor costruttoreP01=>");
			System.out.println("   classeP01="+classeP01);
			System.out.println("   paramsType[0]="+paramsType[0]);
			System.out.println("   paramsType[1]="+paramsType[1]);
			Constructor costruttoreP01=classeP01.getConstructor(paramsType);
			System.out.println("Object IstanzaP01=");
			costruttoreP01.newInstance(parametri);
			// InterrogazioneOrdiniFornitori istanzaP01 = new
InterrogazioneOrdiniFornitori(connessione, utente);
		}			
		catch (ClassNotFoundException e) {System.out.println(e);}
		catch (NoSuchMethodException e) {System.out.println(e);}
		catch (InstantiationException e) {System.out.println(e);} 
		catch (IllegalAccessException e) {System.out.println(e);}
		catch (IllegalArgumentException e) {System.out.println(e);}
		catch (InvocationTargetException e) {System.out.println(e);}
 
		System.out.println("Fine");
}
}
----------------------------------------------------------------
class Es1Chiamata {
 
  String stringa=null;
  Integer numero=null;
 
	Es1Chiamata(String stringa, Integer numero) {	
	this.stringa=stringa;
	this.numero=numero;
	System.out.println("*****>"+stringa+numero);
 
	}
}
-----------------------------------------------------------
Class classeP01 =
Constructor costruttoreP01=>
   classeP01=class Es1Chiamata
   paramsType[0]=class java.lang.String
   paramsType[1]=class java.lang.Integer
java.lang.NoSuchMethodException: Es1Chiamata.<init>(java.lang.String,
java.lang.Integer)
Fine
Press any key to continue...
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 java.lang.Integer)
Prova a definire il costruttore della classe Es1Chiamata con visibilita' 
public...
Ciao ciao
Daniele

 Daniele
Ciao e grazie per le risposte che mi hai dato finora ... :o)


 Mi vien da piangere ...
[CUT]
Dai su' non ne vale la pena di piangere :-) ... che problema ti danno le 
classi "originali" ?
Ciao
Daniele

 Daniele
Ciao e Grazie :o)))


Onestamente non sono riuscito a desumerlo dai vari manuali ... 
...ma la documentazione non mente...
da 
http://java.sun.com/j2se/1.4/docs/api/java/lang/Class.html#getConstructor
(java.lang.Class[])
"Returns a Constructor object that reflects the specified public 
constructor of the class represented by this Class object."
Parla esplicitamente di costruttore public... :-)
HTH
-- 
Ciao
	Fabrizio C.

tipo String.
E qui c'è l'errore!
Dici che il tuo costruttore accetta Statement e String, ma poi nel codice 
ne cerchi uno (vedi trace) che accetti AS400JDBCStatement e String...
Ti sembra logico che non lo trovi? :-)
Invece di ricavare la classe dai parametri veri, costruisci paramsType a 
mano e vedrai che funziona.


 	Fabrizio C.
Grazie mille a tutti!!! :oD


Il discorso è un po' contorto
Beh, sì. :-)
A parole si creano molte ambiguità.
Ci vorrebbe un po' di codice.
(Se lo avessi postato, forse, avremmo potuto aiutarti prima ;-)
In parole povere e un po' grossolane, si potrebbe dire che cercavi un 
costruttore che non c'è:
public InterrogazioneOrdiniFornitori(AS400JDBCStatement stmt, String s) 
{...}
invece di
public InterrogazioneOrdiniFornitori(Statement stmt, String s) {...}
che c'è.
Concordi che non sono proprio la stessa cosa?
Anche se AS400JDBCStatement *è_uno* (nel senso OO di *IS_A*) Statement (che 
comunque è un'interfaccia), getConstructor "si fida" di quello che gli 
ordini. :-)
Ora, però, dovresti soddisfare la mia insana curiosità per i progetti 
altrui. :-)
Ci racconti che ruolo ha questo uso della reflection nella tua 
applicazione? Il nome della classe dice già qualcosa, però...
-- 
Ciao
	Fabrizio C.

 applicazione? Il nome della classe dice già qualcosa, però...
Il mio obbiettivo è creare dei "menù" dinamici per utente, per adesso a
pulsanti ma potrebbero essere in qualsiasi altra forma, decisi da un file
che amministra l'edp.
Mi spiego meglio: all'utente Tizio do' i programmi A, B, e C, mentre
all'utente Caio dò i programmi A e C. Se un domani qualcuno mi dice di
dare anche a Caio il programma B mi limito a variare il suo profilo utente
sul file, senza ricompilare nessuna classe. E da qui la strada (credo)
obbligata della reflection.
Per raggiungere questo ho pensato per ora ad una classe che mi effettua il
collegamento con AS/400, e contemporaneamente crea i pulsanti (ma potrebbe
essere una combo box o qualsiasi altra cosa) per dare accesso alle singole
classi. Ogni classe riceve come parametri la connessione effettuata dalla
prima classe e l'utente che serve anche per altri tipi di autorizzazioni
all'interno dei programmi.
Sto valutando un po' tutto ...
Un sistema informativo c'è già in azienda (in rpg), per il momento provo
ad integrarlo con alcune funzioni in java. Però devo creare le "basi" per
uno sviluppo organico. Mi piacerebbe seguire tecniche Object Oriented per
quanto possibile ...
Certo che occorre tempo, tanto tempo. E in un ambiente lavorativo non
sempre te lo danno (come in questo caso).
Insomma: è tutto da costruire,  e ogni consiglio è bene accetto :o)))
Grazie ancora per l'aiuto precedente :o)
