/ Forside / Teknologi / Udvikling / Java / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Java
#NavnPoint
molokyle 3688
Klaudi 855
strarup 740
Forvirret 660
gøgeungen 500
Teil 373
Stouenberg 360
vnc 360
pmbruun 341
10  mccracken 320
ClassLoader problemer .. stadigvæk
Fra : Janus


Dato : 25-04-01 22:58

Jeg har et program der overfører en .java fil til en anden computer. Denne
computer (serveren) sletter eventuelle andre filer af samme navn (med .class
og .java som ext.), kompilerer .java filen, venter på at .class filen bliver
skrevet til disk. Derefter er det så planen, at min ClassLoader skal loade
denne ny .class fil og returnere en instantiering af denne. Det gør den også
fint nok, men hvis jeg kører klient programmet igen (serveren kører stadig),
og smider en anden .java fil over (med samme navn som før selvf.), hvis
instans skriver noget andet ud på skærmen, er det stadig den gamle instans
der opereres med. Altså hvis metoden doTask() i den overførte .java fil
skriver "1" på skærmen, bliver der stadig skrevet "1" ud på skærmen, selvom
jeg har kørt programmet igen og der er dannet en ny .class fil (den gamle er
blevet slettet på forhånd), hvis metode doTask() skal returnere "2".

Hvad er der galt ?? Jeg kan se, at metoden loadClassData aldrig bliver
kaldt, jeg får ikke strengen ud på skærmen.

Jeg vil tage mig den frihed at smide koden til MyClassLoader.java her i
indlægget:

Husk, at både den gamle .java og .class fil er slettet og de nye ER skrevet
til disken, før ClassLoaderen kaldes.


Med mange venlige hilsner Janus

------------

package file_rmi;

import java.io.*;

public class MyClassLoader extends ClassLoader {

private byte[] loadClassData(String className) {
try {
String cname = "file_rmi.CompileMe.class";
FileInputStream fis = new FileInputStream(cname);
byte[] result = new byte[fis.available()];
fis.read(result);
fis.close();
System.out.println("SimpleClassLoader loading class " + cname);
return result;
}
catch (IOException e)

System.err.println("Class could not be loaded");
return null;
}
}

public Class findClass(String name) throws ClassNotFoundException {
byte[] b = loadClassData(name);
if (b != null) {
return defineClass(name, b, 0, b.length);
}
throw new ClassNotFoundException(name);
}

public static Task getInstance() throws
ClassNotFoundException, InstantiationException, IllegalAccessException {
MyClassLoader loader = new MyClassLoader();
Class c = loader.loadClass("file_rmi.CompileMe", true);
return (Task) c.newInstance();
}
}



 
 
Niels Bech Nielsen (30-04-2001)
Kommentar
Fra : Niels Bech Nielsen


Dato : 30-04-01 16:16

Hvis metoden findClass ikke bliver kaldt skyldes det, at din classloader i
forvejen kunne finde klassen.
Generelt søger en classloader i:
1 Environment specified CLASSPATH
2 bootstrap classes (java.* etc)
3 via findClass i ClassLoaderen.
(evt. 1 og 2 omvendt, jeg kan ikke lige huske det)

Hvis du ligger klasser et sted, hvor eks. CLASSPATH peger på, vil den aldrig
begynde at loade special klasser, som du bruger i dit tilfælde.

Compiler filerne ned i et specielt deployment bibliotek, og så læs dem op
derfra. Så skulle findClass metoden blive kaldt.

--
/Niels Bech Nielsen -- Logical
SCJ2P - ** Sun Certified Java 2 Programmer **

"Janus" <janus141.spam@pop.k-net.dk> wrote in message
news:9c7h64$ktm$1@eising.k-net.dk...
> Jeg har et program der overfører en .java fil til en anden computer. Denne
> computer (serveren) sletter eventuelle andre filer af samme navn (med
..class
> og .java som ext.), kompilerer .java filen, venter på at .class filen
bliver
> skrevet til disk. Derefter er det så planen, at min ClassLoader skal loade
> denne ny .class fil og returnere en instantiering af denne. Det gør den
også
> fint nok, men hvis jeg kører klient programmet igen (serveren kører
stadig),
> og smider en anden .java fil over (med samme navn som før selvf.), hvis
> instans skriver noget andet ud på skærmen, er det stadig den gamle instans
> der opereres med. Altså hvis metoden doTask() i den overførte .java fil
> skriver "1" på skærmen, bliver der stadig skrevet "1" ud på skærmen,
selvom
> jeg har kørt programmet igen og der er dannet en ny .class fil (den gamle
er
> blevet slettet på forhånd), hvis metode doTask() skal returnere "2".
>
> Hvad er der galt ?? Jeg kan se, at metoden loadClassData aldrig bliver
> kaldt, jeg får ikke strengen ud på skærmen.
>
> Jeg vil tage mig den frihed at smide koden til MyClassLoader.java her i
> indlægget:
>
> Husk, at både den gamle .java og .class fil er slettet og de nye ER
skrevet
> til disken, før ClassLoaderen kaldes.
>
>
> Med mange venlige hilsner Janus
>
> ------------
>
> package file_rmi;
>
> import java.io.*;
>
> public class MyClassLoader extends ClassLoader {
>
> private byte[] loadClassData(String className) {
> try {
> String cname = "file_rmi.CompileMe.class";
> FileInputStream fis = new FileInputStream(cname);
> byte[] result = new byte[fis.available()];
> fis.read(result);
> fis.close();
> System.out.println("SimpleClassLoader loading class " + cname);
> return result;
> }
> catch (IOException e)
>
> System.err.println("Class could not be loaded");
> return null;
> }
> }
>
> public Class findClass(String name) throws ClassNotFoundException {
> byte[] b = loadClassData(name);
> if (b != null) {
> return defineClass(name, b, 0, b.length);
> }
> throw new ClassNotFoundException(name);
> }
>
> public static Task getInstance() throws
> ClassNotFoundException, InstantiationException, IllegalAccessException
{
> MyClassLoader loader = new MyClassLoader();
> Class c = loader.loadClass("file_rmi.CompileMe", true);
> return (Task) c.newInstance();
> }
> }
>
>



Søg
Reklame
Statistik
Spørgsmål : 177552
Tips : 31968
Nyheder : 719565
Indlæg : 6408847
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste