04. marts 2005 - 18:33Der 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 (?)
->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?
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
->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?
->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?
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.