Der er lige 3 muligheder, som springer mig i øjnene.
1 Hvorfor få ren java kode over på din server (Husk på, at du sikkert kører
med en simpel security manager, der giver fuld adgang til system, filer,
netværk etc). Istedet
kan du medlevere et API med RMI stubbe til din server (Jeg tror nok, du
skrev noget om RMI på et tidspunkt), og dine server objekter er selvfølgelig
mappet over mod et interface, som du medleverer i koden. Hvis det er tredie
persons server eller program, bør du iøvrigt gøre vedkommende opmærksom på
denne risiko.
2 Hvis du er ivrig efter at få java kode derover, som implementerer et
interface, står det dig vel frit for at ændre navnet på klassen. Det er ikke
svært at lave en søg og erstat så CompileMe kommer til at hedde f.eks.
MyClass_354. Så har du bedre muligheder for at spore dig tilbage (da
CompileMe.java og CompileMe.class vil blive overskrevet hver gang). Du bør
som minimum logge remote socket addr, timestamp og sekvensnummeret på
klassen.
3 Endelig kan du som du har efterspurgt få loaded klassen med en nu
ClassLoader hver gang. Jeg poster et eksempel i dk.binaer (Subj:
SimpleClassLoader.java) . Jeg har compilet min klasse CompileMe, som
implementerer interfacet Task (med metoden doTask()). CompileMe skriver 1 ud
på skærmen i doTask. Denne blev compileret, og klassen blev i mit tilfælde
manuelt omdøbt til CompileMe1.class. Derudover lavede jeg en version 2
(CompileMe2.class), som skriver 2 ud på skærmen. Nu har jeg to udgaver af
CompileMe.
Klassen SimpleClassLoader bruger jeg til at loade mine særlige klasser med.
Bemærk, den er skrevet til JRE1.3. Her gælder, at en ClassLoader vil prøve
at loade klasser v.hj.a. den indbyggede classLoader først, og til sidst hvis
klassen ikke kunne genkendes kaldes findClass(String name) til at hente
klassen. Jeg har derfor placeret CompileMe klasserne i et underbibliotek,
som der ikke er classpath til, og derfor kaldes findClass.
Min private counter bruges bare til at loade de to versioner op sekventielt.
Bemærk, at når jeg henter en instans, tager jeg fat i en ny classloader, og
loader classen op. Derved "glemmes" den gamle classLoader og derfor den
gamle klasse definition. I main kan du også se, at t1 og t2 ikke har samme
klasse (Fordi de er loaded af hver sin ClassLoader).
Håber det giver dig lidt inspiration, men tænk dig for gud skyld om, og kig
evt. videre på security mekanismerne (Jeg er ikke så stiv i det selv), for
det er noget af en bagdør du kan komme til at åbne ubevidst.
/Niels Bech Nielsen -- Logical
SCJ2P - ** Sun Certified Java 2 Programmer **
"Janus" <janus141.spam@pop.k-net.dk> skrev i en meddelelse
news:9akn60$5p1$1@eising.k-net.dk...
> Det er klassen CompileMe, der implementerer interfacet Task, jeg
> instantierer.
> Det, jeg vil lave er, at klienten overfører en .java fil, som serveren
> kompilerer og derefter eksekverer. Kompileringen kan ikke foregå på
> klienten, da det skal være muligt for klienten at lave referencer til
> objekter, han ikke har i sin besiddelse.
> Denne proces skal så kunne gentages så mange som man lyster. Dvs. den
..java
> fil der overføres hedder det samme fra gang til gang, men indholdet er
noget
> andet. Eneste lighed, rent kodemæssigt, er, at der i .java filen står
> "public class CompileMe implements Task" og at en metode defineret i
> interfacet realiseres.
>
> Håber, det er til at forstå.
>
> Og på forhånd mange gange tak for hjælpen.
>
> Mvh Janus
>
>
> "Niels Bech Nielsen" <nbn@logical.nospam.dk> wrote in message
> news:s4pma9.slm.ln@java.logical.dk...
> >
> > "Janus" <janus141.spam@pop.k-net.dk> skrev i en meddelelse
> > news:9ahik3$6ue$1@eising.k-net.dk...
> > > Jeg gør sådan:
> > > Task ta = new Task();
> > > ta.doTask(); // lad os sige, den returnerer tallet 1.
> > > [Så bliver klassen CompileMe, der implementerer interfacet Task,
slettet
> > og
> > > skrevet igen på harddisken, bare med et andet indhold, så doTask()
> > > returnerer 2]
> > > ta = new Task();
> > > ta.doTask(); // den skal returnere 2, men returnerer 1
> >
> > Hvis Task er et interface kan du ikke lave en new Task().
> >
> > Jeg sidder her og bliver fuldstændig i tvivl om, hvad det overhovedet
er,
> du
> > gerne vil lave? Er du sikker på, at du på at du vil dynamisk genloade
den
> > samme klasse?
> >
> > Jeg vil prøve hvis jeg får tid, at konstruere et kort eksempel på
hvordan
> du
> > kan anvende ClassLoadere til at få dine klasser ind dynamisk.
> >
> >
> >
> >
>
>