/ Forside / Teknologi / Udvikling / Java / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Java
#NavnPoint
molokyle 3688
Klaudi 855
strarup 740
Forvirret 660
gøgeungen 500
Teil 373
Stouenberg 360
vnc 360
pmbruun 341
10  mccracken 320
Dynamisk generering af klasser
Fra : Thorbjørn Ravn Ander~


Dato : 12-04-02 09:56


Jeg har en situation hvor jeg har et oenske om at generere klasser ud
fra betingelser der ikke kan forudsiges paa forhaand (Beans ud fra
JDBC-svar), og jeg har funderet lidt over hvordan det kan goeres,
isaer fordi jeg godt vil have Bean-metoderne navngivet efter
samme uforusigelige resultater.

Det har jeg nu funderet over et stykke tid, og er naaet frem til at
jeg ikke vil kunne lave dette som statisk kode, paa andre maader end
hvis jeg bruger en form for en Hashtabel hvilket ikke giver den
oenskede fleksibilitet paa Bean-niveau.

Der er altsaa et behov for at generere kode on-the-fly. Her har jeg
konstateret tre muligheder:

* Bruge JSP-omgivelserne til at generere en JSP-side og lade den
definere den paagaeldende klasse, hvorefter det er JSP-serverens
opgave at faa det oversat og indlaest. Her er der lidt problemer
med fysisk filplacering, da vi oensker mindst mulig boevl ved at
skifte mellem webservere.

* Generere helt almindelige Java-klasser, og bruge dem direkte,
hvilket kraever af JSP-serveren at den kan genoversaette disse on
the fly. Lider af samme sti problemer som den ovenfor, samt at det
ikke er alle servere som kan hitte ud af dette. Resin kan, Tomcat
kan ikke.

* Eftersom det er meget faa operationer jeg skal lave (getXXX, setXXX
og en constructor med en masse JDBC-kald) kunne man jo generere Java
Bytecode selv, og fodre det til ClassLoader.defineClass. Herved
undgaaes ogsaa alle mellemfilerne, men med lidt ekstra boevl. En
passende Java assembler ville nok vaere en god ide.

Er der nogen andre der har puslet med noget tilsvarende og som har
nogen erfaringer at dele? Jeg har ikke kunne hitte noget paa nettet,
og jeg tror det vil vaere noget som mange kan have glaede af idet jeg
har haft svaert ved at finde en god klistermekanisme mellem Beans og
JDBC uden at der begyndte at saa J2EE over det hele.

JDBC-driverne er ioevrigt Oracle 9i. Hvis de har nogen interessante
ting i denne forbindelse (jeg bruger allerede deres Pool-teknologi)
saa ville det da ogsaa vaere rart.

--
Thorbjørn Ravn Andersen
http://homepage.mac.com/ravn

 
 
Dennis Bohnstedt Han~ (12-04-2002)
Kommentar
Fra : Dennis Bohnstedt Han~


Dato : 12-04-02 12:49

Hej Thorbjørn

Jeg har ikke selv nogen erfarring med emnet, men jeg kan måske hjælpe
dig på sporet alligevel.

Der var på dette års JavaOne en session om emnet. Den hed "A Crash
Course in Dynamic Class Generation" og havde nummer TS-2558. Jeg ved
ikke om den blev filmet, men i så fald kan den ses på Java Learning
Center (http://java.sun.com/learning/) hvis du har adgang dertil. Ellers
kan du finde slides fra sessionen på følgende link:

http://servlet.java.sun.com/javaone/resources/content/sf2002/conf/sessions/pdfs/2558.pdf

Håber det hjalp lidt...

Hygge
/Dennis

Thorbjørn Ravn Andersen wrote:
> Jeg har en situation hvor jeg har et oenske om at generere klasser ud
> fra betingelser der ikke kan forudsiges paa forhaand (Beans ud fra
> JDBC-svar), og jeg har funderet lidt over hvordan det kan goeres,
> isaer fordi jeg godt vil have Bean-metoderne navngivet efter
> samme uforusigelige resultater.
>
> Det har jeg nu funderet over et stykke tid, og er naaet frem til at
> jeg ikke vil kunne lave dette som statisk kode, paa andre maader end
> hvis jeg bruger en form for en Hashtabel hvilket ikke giver den
> oenskede fleksibilitet paa Bean-niveau.
>
> Der er altsaa et behov for at generere kode on-the-fly. Her har jeg
> konstateret tre muligheder:
>
> * Bruge JSP-omgivelserne til at generere en JSP-side og lade den
> definere den paagaeldende klasse, hvorefter det er JSP-serverens
> opgave at faa det oversat og indlaest. Her er der lidt problemer
> med fysisk filplacering, da vi oensker mindst mulig boevl ved at
> skifte mellem webservere.
>
> * Generere helt almindelige Java-klasser, og bruge dem direkte,
> hvilket kraever af JSP-serveren at den kan genoversaette disse on
> the fly. Lider af samme sti problemer som den ovenfor, samt at det
> ikke er alle servere som kan hitte ud af dette. Resin kan, Tomcat
> kan ikke.
>
> * Eftersom det er meget faa operationer jeg skal lave (getXXX, setXXX
> og en constructor med en masse JDBC-kald) kunne man jo generere Java
> Bytecode selv, og fodre det til ClassLoader.defineClass. Herved
> undgaaes ogsaa alle mellemfilerne, men med lidt ekstra boevl. En
> passende Java assembler ville nok vaere en god ide.
>
> Er der nogen andre der har puslet med noget tilsvarende og som har
> nogen erfaringer at dele? Jeg har ikke kunne hitte noget paa nettet,
> og jeg tror det vil vaere noget som mange kan have glaede af idet jeg
> har haft svaert ved at finde en god klistermekanisme mellem Beans og
> JDBC uden at der begyndte at saa J2EE over det hele.
>
> JDBC-driverne er ioevrigt Oracle 9i. Hvis de har nogen interessante
> ting i denne forbindelse (jeg bruger allerede deres Pool-teknologi)
> saa ville det da ogsaa vaere rart.
>



Thorbjørn Ravn Ander~ (15-04-2002)
Kommentar
Fra : Thorbjørn Ravn Ander~


Dato : 15-04-02 15:04

thunderbear@bigfoot.com (Thorbjørn Ravn Andersen) writes:

> * Eftersom det er meget faa operationer jeg skal lave (getXXX, setXXX
> og en constructor med en masse JDBC-kald) kunne man jo generere Java
> Bytecode selv, og fodre det til ClassLoader.defineClass. Herved
> undgaaes ogsaa alle mellemfilerne, men med lidt ekstra boevl. En
> passende Java assembler ville nok vaere en god ide.

Jeg har nu lavet det meste af det jeg gerne ville have, ved hjaelp af
BCEL biblioteket fra Apache Jakarta, og jeg har nu noget byte code i
en byte[], som ser fin ud paa disken (javap -c), men jeg kan ikke
rigtigt faa kaldt ClassLoader.defineClass(), da den er protected.

Dette opdagede jeg ved at bede om getSystemClassLoader, og saa kalde
cl.defineClass paa denne. Lidt soegen hid og did har ikke gjort mig
meget klogere, og BCEL dokumentationen er svjks tavs paa dette
omraade.

Er der nogen der har rodet med den slags og som kan tippe mig til
hvordan jeg faar min byte-code ind i systemet? En stump fungerende
kode, vil blive modtaget med kyshaand

Paa forhaand tak,
--
Thorbjørn Ravn Andersen
http://homepage.mac.com/ravn

Lars Dam (15-04-2002)
Kommentar
Fra : Lars Dam


Dato : 15-04-02 16:14

On 15 Apr 2002 16:04:10 +0200, thunderbear@bigfoot.com (Thorbjørn Ravn
Andersen) wrote:

>
>Dette opdagede jeg ved at bede om getSystemClassLoader, og saa kalde
>cl.defineClass paa denne. Lidt soegen hid og did har ikke gjort mig
>meget klogere, og BCEL dokumentationen er svjks tavs paa dette
>omraade.
>
>Er der nogen der har rodet med den slags og som kan tippe mig til
>hvordan jeg faar min byte-code ind i systemet? En stump fungerende
>kode, vil blive modtaget med kyshaand

*Plonk* - er det ikke bare et spørgsmål om at definere din egen
ClassLoader (som extender ClassLoader)?

Der efter skal du så fremover, når du opretter nye instanser vha.
newInstance() bruge
Class.forName(name,true,instanceofyourclassloader);

>Paa forhaand tak,

vh. ld
---
"Time is the fire in which we burn"

Thorbjørn Ravn Ander~ (15-04-2002)
Kommentar
Fra : Thorbjørn Ravn Ander~


Dato : 15-04-02 17:33

Lars Dam <lars_simple_spam_protection_dam@post2.tele.dk> writes:

> *Plonk* - er det ikke bare et spørgsmål om at definere din egen
> ClassLoader (som extender ClassLoader)?

Jo, men jeg forsoegte at goere det som en anonym klasse, og det vil
compileren ikke vaere med til. Efter at have lavet en navngivet
klasse (og brugt den som type i stedet for ClassLoader) hjalp det en
del paa det. Saadan er det naar man skal vaere for smart.

Tak for hjaelpen. Det skubbede i den rigtige retning ved at give
Google-soegeord.

--
Thorbjørn Ravn Andersen
http://homepage.mac.com/ravn

Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408926
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste