07. oktober 2003 - 16:01Der er
15 kommentarer og 1 løsning
URLClassLoader cacher object
Hiya
Har været ved at lege lidt med en irc bot og har i den forbindelse fundet det smart at kunne opdatere den mens den kører.
Til det har jeg lavet noget kode der kan indlæse en class ud fra en url. Koden virker fint, problemet er bare at anden gang jeg vil indlæse en fil efter at der er foretaget ændringer, så indlæser den stadigt samme cachede version (filen bliver ændret på hd'en). Jeg går ud fra det har noget at gøre med hvilken class loader URLClassLoader bruger men har ikke kunnet finde en løsning.
Herunder den metode der loader (jeg tester det i en simpel bot til dette formål, derfor den meget grimme opbygning =)
Når klassen en gang er loadet, så vil den bruges til alle objekter af den type fremover.
Imidlertid identificeres en klasse af både fuld navn inkl. pakke og classloader.
Så når du loader med en ny classloader burde du få den nye klasse loadet.
Hvis (og det er vigtigt !) altså at den classloader bliver brugt til at loade den med - eller på direkte dansk: de klasser der skal loades må *ikke* være i classpath (fordi så loades de nemlig af parent classloader !).
jeg har prøvet at haft .class filen til at ligge både lokalt (hvilket muligvis er i classpath, men tror jeg ikke) og på en webserver som helt sikkert ikke er i classpath.. resultatet er det samme. Hvordan skifter jeg lige classloaderen ud? jeg laver jo et nyt URLClassLoader object hver gang og kan ikke lige se hvordan jeg selv kan loade en classloader at give den.
Jeg kan godt se hvor du vil hen med koden, men når jeg kører den her udskriver den ikke noget overhovedet.. jeg vil lige prøve at implementere din måde i min kode og se hvad der sker
fik det til at virke, den mappe jeg placerede det i til at teste lå i som undermappe til classpath. Sjovt at den overhovedet ikke skrev noget ud før dog.
Har endnu ikke fået det til at virke med den kode jeg postede først har ændret det til:
try{ ClassLoader loader = new URLClassLoader( new URL[] { new URL(url)}); Class loadedClass = Class.forName(cName, true, loader);
Tjekkede lige på om classpath kunne være problemet, og ingen af mapperne/parent folders til det her projekt ligger i classpath. Jeg starter programmet op med java.exe -classpath %CLASSPATH% TestBot
hvor %CLASSPATH% indeholder stien til en række jar filer såsom commons logging og mit irc lib.
Hehe jo =) Skulle måske overveje at læse hvad du skriver. Skal lige havde afprøvet at det er der problemet stammer fra, men er det sandsynligvis.
Problemet er så at det er noget bøvlet at de ikke må ligge i .jar filen når det jeg nu gerne vil er at kunne opdatere eksisterende filer uden at skulle genstarte den. Kan selvfølgeligt altid lade den loade fra en source der ikke er i classpathen, men virker på en eller anden måde ikke helt korrekt.
Du har mere end fortjent dine point så smid lige et svar =) men du skulle vel ikke vide om man kan omgå denne begrænsning ved at extende ClassLoader og så kalde den protectede defineclass selv med .class filens indhold?
Det skal enten være URL til en jar-fil eller ende med / for at være et directory.
Synes godt om
Ny brugerNybegynder
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.