Newsgroup: it.comp.java
Titolo: Creare una classe al volo

In un mio programma (in java) vorrei dinamicamente creare (non richiamare)  
una nuova classe  coi suoi metodi e campi (ovviamente creati dinamicamente  
anche loro) e quindi usarla.
Così a sbuzzo ho dato un occhiata dentro Class per farmi ispirare, ma non  
c'ho trovato niente che sembrasse fungere allo scopo (il fatto che  
getMethod possa lanciare NoSuchMethodException mi puzza di vicolo cieco).
Si può fare quello che voglio (e quindi ho sbagliato strada) o stò  
chiedendo troppo?
Già che ci siamo la differenza tra getMethod e getDeclaredMethod mi  
incuriosiscie.
-- 
Manny Calavera
Mail to: anforagimailpuntocom²
(\_/)  <- This is Bunny.
(°_°)     Copy Bunny into your signature to help
(> <)     him on his way to world domination.


http://csvtosql.sf.net

 meriti un dieci per la signature. :)
Fosse mia...
In realtà ha conquistato anche me :)
-- 
Manny Calavera
Mail to: anforagimailpuntocom²


Mi sa che:
1. O ti crei un file di testo con il codice sorgente della classe, poi
invochi il compilatore a runtime e infine ti carichi il .class usando
URLClassLoader.
2. Credo che una libreria come BCEL di apache ti permetta di creare
direttamente il bytecode a runtime, prova a darci un occhiata:
http://jakarta.apache.org/bcel/index.html
In ogni modo, poi il tuo oggetto devi usarlo unicamente via reflection,
perche' a compile time tu non puoi dichiararne il tipo (che non
esiste), quindi ti converrebbe (se e' possibile) fare in modo che la
tua classe generata dinamicamente estenda un'interfaccia gia' presente
a compile time.

 
http://jakarta.apache.org/bcel/index.html
Intanto grazie, sicuramente la prima è la più praticabile, visto che non  
abbisogna di librerie extra (il tutto dovrebbe essere molto piccolo e se  
possibile usare solo le librerie standard), sono però sicuro che con c#  
quel che voglio fare è possibile direttamente. Quelli della Sun sono  
rimasti indietro su sto punto? (anche se a dire il vero non so quanto sia  
utilizzata come funzione)
Grazie ancora


 Grazie ancora
Ci stanno lavorando... intanto prova questo, potrebbe piacerti
http://www.beanshell.org
l'intenzione finale sarebbe quella di creare un interprete di codice
sorgente Java (compatibile con la reflection). Vedi se ti può servire :)
-- 
Fermiamo Scientology prima che sia troppo tardi!!!
http://xenu.com-it.net
 - 
http://xenu.freewinds.cx/
 - 
http://www.xenu.net/
(per rispondere personalmente leva IlDitoDalCulo)

 quanto sia  utilizzata come funzione)
ci sono varie cose in corso d'opera.
Ti hanno già segnalato:
bcel: libreria apache per leggere/modificare/scrivere direttamente i 
.class (e usarli).
beanshell: interprete java dentro java: crei una stringa con la tua 
classe, crei un ambiente (valori di variabili ecc) e la esegui. In 
realtà, se ho ben capito, si basa su librerie che permetterebbero di 
eseguire anche codice di altri linguaggi (ma non sono sicuro di aver ben 
capito, magari ho detto una stupidaggine)
In più io tempo fa stavo valutando l'idea di usare 'groovy' che ha una 
metodologia simile a beanshell ma è un linguaggio di scripting. La 
differenza è che è meno tipizzato e in qualche modo più semplice, 
dipende da chi deve poi creare le 'classi' da far eseguire. Mi spiego: 
se all'interno il programma genera la classe, java va bene, se invece la 
'classe' da eseguire la deve scrivere un utente, magari mettergli a 
disposizione qualcosa di più immediato è meglio.
Ora che mi ricordo, ci sarebbe anche un 'esecutore di python', mi pare 
si chiamasse jpython (che fantasia) in java.
bye
DKano

:
MC> Intanto grazie, sicuramente la prima è la più praticabile, visto
MC> che non abbisogna di librerie extra (il tutto dovrebbe essere
MC> molto piccolo e se possibile usare solo le librerie standard),
Meglio un jar in più che affidarsi ad un compilatore esterno.
MC> sono però sicuro che con c# quel che voglio fare è possibile
MC> direttamente. Quelli della Sun sono rimasti indietro su sto punto?
No. C# è populista, Java è coerente.
Peraltro ti hanno consigliato la beanshell.
La beanshell è un tool molto  potente, JDEE - un potente modo per Java
sotto Emacs,  potente da far  apparire ridicolo l'editor  integrato in
Eclipse - lo usa per analizzare classi presenti al fine di sapere cosa
importare o come completare il codice.
Ma riguardo alla compilazione si dice:
      Specify the type, and if necessary, the location of the compiler
      to Hide  Rest be  used to compile  source files for  the current
      project.  The JDE supports  three compilers: javac server, javac
      executable,   and   jikes.     The   javac   server   runs   the
      com.sun.tools.javac  package  included   with  the  JDK  in  the
      Beanshell. The  javac executable shipped with the  JDK also uses
      this  package. The  advantage of  the  javac server  is that  it
      avoids  the  vm startup  time  that  accounts  for most  of  the
      compilation  time consumed  by the  javac executable.  The javac
      server uses  the version of com.sun.tools.javac  included in the
      JDK for the current project.
Quindi se lanci javac va a finire che lanci una seconda jvm, quindi il
"piccolo" della prima soluzione mi sa che va un po' su per il camino.
-- 
 /\            ___
/___/\__|_|\_|__|___Gian Uberto Lauri_____________________
  //--\ | | \|  |   Integralista GNUslamico  
\/		    e allevatore di bug da competizione

 si chiamasse jpython (che fantasia) in java.
penso fosse jython


 incuriosiscie.
In uno dei "soltiti siti" (On java, server side, developerworks) c'era
un bell'articoletto su come compilare dinamicamente una classe fornendo
il sorgente come file o String
Citava anche un IDE (Eclipse?) che userebbe questo metodo per compilare
i sorgenti, richiedendo solo un JRE e non un JDK completo.
Se la mia memoria regge ...
Purtroppo l'articolo era breve e "intrigante", cosi' ... l'ho solo
stampato ed e' finito in un mucchione alto due spanne, che non mi
azzardo neanche a spostare.
Ciao,
    Davide Grandi
--
Ing. Davide Grandi
davide...@mclink.it

Se ti interessa codice per compilare codice java al volo, prova a dare
un'occhiata a
http://cvs.sourceforge.net/viewcvs.py/sadun-util/Utility%20classes/source/org/sadun/util/codegen/ObjectWrapperGenerator.java?view=markup