Avatar billede jespersahner Nybegynder
04. marts 2005 - 18:33 Der er 8 kommentarer og
1 løsning

Bytecode-manipulation

Med Javassist, BCEL, ASM osv. er det muligt at manipulere bytecode og reloade en given klasse med de foretagne ændringer.

Men hvorledes forholder det sig med allerede oprettede objekter af en given klasse?

Jeg tænker her på en situation, hvor et objekt indeholder  referencer til andre objekter, og hvor man løbende ønsker at føje nye referencer til på "add-on" basis, altså som tilføjelser til de allerede oprettede referencer. Dette kunne f.eks. være aktuelt, hvis man øsnker at lave en slags "open-end" klasse, hvor brugeren løbende kan føje ny kode til, som så bliver eksekveret.

En sådan funktionalitet findes f.eks. i programmet BeanShell (BeanShell benytter i øvrigt ASM), som er en slags Java-fortolker, og jeg er her lidt nysgerrig efter, hvordan teknikken skrues sammen i relation til manipulation af bytecoden for et allerede eksisterende objekt.

Jeg antager, at det ikke er muligt at manipulere med koden, når først den er læst ind i JVM, hvorfor der vel må ske en form for relaod af klassen i takt med nye referencer kommer til og bytecoden manipuleres svarende hertil (?)
Avatar billede arne_v Ekspert
04. marts 2005 - 19:01 #1
En klasse kan kun loades en gang.

Men klasses navn er implicit prefixet med classloaderen identitet.

Så du loader klasse p.subp.K med classloader cl1 og så loader du en
ny p.subp.K med classloader cl2 og det er 2 forskellige klasser.

Alt bliver garbage collectet helt normalt når den tid kommer.
Avatar billede jespersahner Nybegynder
05. marts 2005 - 01:30 #2
->arne_v: Ok, men har du nogen ide om, hvordan man bærer sig ad i den beskrevne situation; altså hvor man løbende ønsker at føje til et eksisterende objekt?
Avatar billede arne_v Ekspert
05. marts 2005 - 19:30 #3
Er det ikke lige ud af landevejen ?

du opbygger en logisk klasse
du henter et byte array ud af det og laver en klasse
du tilføjer noget mere til den logiske klasse
du henter et byte array ud af det igen og laver en ny klasse
Avatar billede jespersahner Nybegynder
06. marts 2005 - 00:29 #4
->arne_v: Jo, jeg forstår det du skriver som om, at man reloader den nye udvidede klasse (forfra) hver gang (med ny classloader), men jeg tænker her ikke bare på klassen men på objekter af klassen. Hvordan får man kopieret objekter af den gamle klasse over i den nye klasse?
Avatar billede jespersahner Nybegynder
06. marts 2005 - 15:48 #5
->arne_v: En anden ting: Når jeg loader klasse p.subp.K med classloader cl1 hhv. cl2 og derved får 2 nye klasser, hvordan cast'er jeg så efterfølgende andre objekter til hver af disse klasser? Det er vel ikke entydigt at skrive f.eks.:
(p.subp.K)o
- hvor o f.eks. er af type Object?
Avatar billede arne_v Ekspert
06. marts 2005 - 16:45 #6
Set fra Javas side er det 2 helt forskellige klasser.

Du kan ikke på den måde udvide den eksisterende klasse og dermed påvirke
createde objekter.
Avatar billede arne_v Ekspert
06. marts 2005 - 16:46 #7
Klasser som du laver på den måde skal du enten tilgå med reflection.

Eller du skal lade dem extende en basis klasse eller implementere et
interface som du kan caste til.
Avatar billede jespersahner Nybegynder
10. marts 2005 - 11:14 #8
->arne_v: Det må vist være tid med et svar..
Avatar billede arne_v Ekspert
10. marts 2005 - 11:15 #9
ok
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester