Newsgroup: it.comp.java
Titolo: Convertire il contenuto di una stringa in Classe

Devo scaricare da un server una classe java in formato stringa ed
eseguire un metodo.
Il server non è installato java quindi l'uso di RMI è da escludere,
oltrettutto è il client a dover eseguire il codice.
Per quanto riguarda la reflection non ho trovato metodi che mi
convertino da string a class.
Come posso fare?
Help me!

 Come posso fare?
Spiegati meglio.
-- 
Andrea Francia
http://andreafrancia.blogspot.com/2008/07/colinux-linux-dentro-windows.html

 eseguire un metodo.
Come dice Andrea Francia tutto dipende da *cosa* hai sul server.
Se per esempio hai una classe serializzata (che hai serializzato da qualche
parte e sbattuto sul server come file) la scarichi con ObjectInputStream;
poi usi la reflection etc.
Se invece il server è obbligato a sparar fuori *testo* potresti sempre
passare per ObjectI/OStream ma con la seccatura di dover passare da stringa
a stream binario; resto dubbioso in questo caso su come farebbe il server ad
aver a disposizione quella stringa...

 Spiegati meglio.
Mah...a me pare evidente che cerchi di fare una specie di "eval" alla 
javascript, ma su Java.
L'unica è :
-ottenere la stringa
-salvare la stringa su file temporaneo
-compilare al volo la classe (con javac)
-caricare il .class a runtime  (usando un classloader?)

 javac) -caricare il .class a runtime  (usando un classloader?)
Dimenticavo l'ultimo punto,
-usare la reflection per istanziare e invocare metodi della classe.



Ora che mi viene in mente, forse potresti provare con BeanShell. 
BeanShell è un linguaggio di scripting in grado di interpretare 
direttamente il sorgente Java, invece dei normali .class come avviene 
normalmente.
Ora non so esattamente come, una volta interpretato il sorgente, tu possa 
vederlo al di fuori di BeanShell. Credo che tuttavia sia possibile. 
Inoltre magari non hai neppure bisogno di uscire da BeanShell.


Grazie cicap, ma pensandoci meglio posso semplificare la cosa mandando
al client direttamente il file .class in modo da dover solo, mediante
la reflection, eseguire il metodo che mi interessa.
Mi chiedo però come faccio ad usare la reflection senza salvare il
file sul disco...secondo voi è possibile, o devo ogni volta salvarlo
sul disco e poi cancellarlo?
Un ultima cosa...poichè il soft lato client è un exe, quando scarico
il file .class, lo devo salvare nella stessa cartella dove è presente
l'exe prima di chiamare class.forName?
Grazie anticipatamte, e mi scuso per non essere stato molto chiaro
prima.
PS: Devo dire che "qui" siete molto attivi! ;)

 l'exe prima di chiamare class.forName?
Non fai prima a mandare uno script python o groovy e poi eseguirlo con 
jpython o groovy?



C'e' Groovy anche che accetta una sintassi molto simile a quella del Java.



Pero' forse beanshell è meglio perché accetta la sintassi uguale a 
quella del Java.
Facci sapere cosa hai scelto.


JekDaniel wrote:

provo a dare i miei due cents.....
class Prova{
        private String primo;
        private int secondo;
        public Prova(String primo, int secondo){
                this.primo = primo;
                this.secondo = secondo;
        }
        public test(){
                System.out.println(primo + " " + String.valueOf(secondo));
        }
}
Class cl = Class.forName("Prova");
Constructor c = cl.getConstructor(new Class[] {String.class, int.class});
Prova p = (Prova) c.newInstance("Primo",1);
p.test();
naturalmente devi conoscere cosa stai chiamando e la stringa della classe
deve ripettare anche il percorso del package
Umberto


Mi chiedo però come faccio ad usare la reflection senza salvare il



Anche salvandola su disco non risolvi nulla, a meno che non riavvii
l'applicazione. Come detto in precedenza, c'e' bisogno di lavorare con
il classloader.
Come tecnica di esempio ho trovato questo:
http://www.javafaq.nu/java-example-code-895.html
non so quanto sia valido pero'...

Gentilissimi, grazie!
Mi metto a studiare classloader!

 Mi metto a studiare classloader!
Non č piu' facile il discorso di beanshell?



Direi di si se sul server ha il sorgente...ma non ho capito alla fine
che diavolo ci sia in quel server :)

 che diavolo ci sia in quel server :)
Nel senso che non l'hanno ancora deciso, che non l'hai deciso tu, o che 
non te l'hanno ancora detto?


 non te l'hanno ancora detto?
LOL, sono cicap. Non è che hai bisogno di una vacanza ultimamente?  ;)


Hai ragione, mi sono confuso.


Perfetto...devo dire che BeanShell e Groovy sono ottimi.
ho risolto il problema...grazie ancora!