Avatar billede jespersahner Nybegynder
31. august 2005 - 17:28 Der er 13 kommentarer og
1 løsning

Returnere bytecode for given klasse

Findes der en klasse/metode, der returnerer bytecoden for en given klasse?

Med ClassLoader.defineClass() kan man definere en klasse ud fra bytecoden - det er så at sige det omvendte jeg er på udkig efter her.
Avatar billede arne_v Ekspert
31. august 2005 - 17:35 #1
kan du læse dem med getResourceAsStream ? (jeg har ikke prøvet)
Avatar billede jespersahner Nybegynder
31. august 2005 - 18:10 #2
->arne_v: Er i tvivl om argumentet, får null hele tiden.

Der burde næsten være en metode, der ud fra this.getClass() returnerede bytecoden.

Kan man bare indlæse .class-filen direkte ind i et byte[]-array, tænker jeg?
Avatar billede arne_v Ekspert
31. august 2005 - 18:16 #3
klassenavn med / fremfor .

----

ja
Avatar billede jespersahner Nybegynder
31. august 2005 - 18:21 #4
->arne_v: Klassenavn med / fremfor . ?

Jeg får nu f.eks. "core/Hej.class" til at virke, er det det samme du bruger som argument?
Avatar billede arne_v Ekspert
31. august 2005 - 18:22 #5
ja - det navn som classen har i jar filen
Avatar billede jespersahner Nybegynder
31. august 2005 - 18:45 #6
->arne_v: Jeg skylder dig at fortælle, hvad jeg tænker her. Måske er ideen helt vanvittig :-)

Jeg har som nævnt i tidligere spm. lidt problemer med dynamisk classloading. Class.forName() kan ikke altid finde relevante klasser, idet disse ikke er i classpath. Derfor kan man prøve med en URLCLassLoader, der peger specifikt på den klasse, der skal load'es. Dette er imidlertid ikke helt problemfrit, idet URLClassLoader måske load'er supplerende klasser/interfaces, som allerede er load'et. Cast til et sådant interface går derfor galt.

Ok, men hvis man nu
1) load'er specifik klasse (uden for classpath) med en URLClassLoader
2) genererer bytecoden for den load'ede klasse
3) sender bytecoden videre til Minklasse.class.getClassLoader().getSystemClassLoader().defineClass()

- hvor tanken er at bruge URLClassLoader'en+bytecoden som en slags "proxy" mellem systemclassloader'en og klassen, der skal load'es.

Vil det efter din mening virke, eller er det rent sludder? :-)
Avatar billede arne_v Ekspert
31. august 2005 - 20:23 #7
det kan jeg ikke lige gennemskue

umiddelbart tror jeg at du skulle satse på en forsimpling af din applikations
arkitektur så du undgik det her behov
Avatar billede arne_v Ekspert
31. august 2005 - 20:24 #8
bl.a. er defineClass jo protected
Avatar billede jespersahner Nybegynder
31. august 2005 - 20:52 #9
->arne_v: Enig, det er bare et forsøg på en fræk løsning. Men måske er det lidt snedigt, hvis jeg er heldig :-)

Flg. vil vel virke (?):

public class MyClassLoader extends ClassLoader {
    public Class load(String s, byte[] b) {
        return defineClass(s,b,0,b.length);
    }
}
Avatar billede jespersahner Nybegynder
31. august 2005 - 20:53 #10
->arne_v: Smid gerne et svar.
Avatar billede arne_v Ekspert
31. august 2005 - 21:03 #11
løser den problemet ? nu har du jo igen en ny classloader !

----

svar
Avatar billede arne_v Ekspert
31. august 2005 - 21:04 #12
om igen
Avatar billede jespersahner Nybegynder
31. august 2005 - 21:10 #13
->arne_v: Er det ikke sådan med protected, at klasser indenfor samme pakke har adgang og klasser i andre pakker har adgang, for så vidt de er nedarvet?
Avatar billede arne_v Ekspert
31. august 2005 - 21:13 #14
det er vist rigtigt
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