Class (re)loading med JDK1.2
Jeg har kaempe problemer med at faa mine klasser til at reloade paa den maade, jeg oensker.Mit problem er, at jeg har en klasse A, der bruger en statisk (package protected) variabel 'var1' i klasse B, fx:
package com.da.lige;
class A
{
public A()
{
System.out.println("Hello " + B.var1);
}
}
package com.da.lige;
class B
{
static String var1 = "Eksperten!";
}
Godt, nu er det saadan, at jeg vil goere det muligt, at reloade mine klasser mens jeg koerer mit lille Java proggy. Problemet er, at jeg paa ingen maade kan faa JVM til at forstaa, at min klasse A tilhoerer samme pakke som klasse B, saa jeg kan ikke faa lov til at bruge 'var1', hvis jeg reloader klasse A.
Det kan jo ikke vaere meningen ... eller er det mig, der har misforstaaet hele begrebet? Jeg har forsoegt med mange (laes: rigtig mange) implementeringer af ClassLoader klassen, men det er ikke lykkedes mig at faa det til at virke (uden at loade *alle* klasser i en given pakke og det er jeg ikke interesseret i!).
Et eksempel paa min mest simple ClassLoader, kan se ud som flg:
public class FrameworkClassLoader extends ClassLoader
{
private byte[] loadClassData(String classname)
{
FileInputStream fis = null;
ByteArrayOutputStream baos = null;
try
{
String filename = classname.replace('.', '/') + ".clazz";
fis = new FileInputStream(filename);
baos = new ByteArrayOutputStream();
byte buf[] = new byte[4092];
for(int i = 0; (i = fis.read(buf)) != -1; )
{
baos.write(buf, 0, i);
}
return baos.toByteArray();
}
catch(Exception e)
{
;
}
finally
{
if (fis != null)
{
try
{
fis.close();
}
catch (IOException ioe)
{
;
}
}
if (baos != null)
{
try
{
baos.close();
}
catch(IOException ioe)
{
;
}
}
}
return null;
} // > private byte[] loadClassData(String classname)
public Class findClass(String name)
throws ClassNotFoundException
{
byte[] data = loadClassData(name);
if (data != null)
{
return cl = defineClass(name, data, 0, data.length);
}
throw new ClassNotFoundException(name);
} // > public Class findClass(String name)
}
Jeg har rippet en masse fra ovenstaaende, men den burde virke (bemaerk, at det skal koere paa JDK1.2 og derfor ikke har brug for de forskellige loadClass() implementeringer, som det var tilfaeldet i < JDK1.2).
Jeg proever, at loade en given '.clazz' fil fra min lokale disk. Naar jeg har laest den kalder jeg 'defineClass', der parser klasser og goer den tilgaengelig.
I en anden klasse kalder jeg saa min klasse-loader, cacher allerede loadede klasser, etc.
Naa, men det var nok snak, nu er mit spoergsmaal saa:
* Skal man absolut loade alle klasser i en pakke for
at faa en ClassLoader til at kende til package
variabler?
Hvis der er nogen der har noget sample kode til JDK1.2 klasseloading, saa vil jeg meget gerne have det. Det er meningen, at mit program skal kunne:
1. Loade en helt ny (ukendt for JVM) klasse
2. Reloade en eksisterende klasse
3. Genbruge en eksisterende klasse, hvis den
ikke har vaeret modificeret (det styrer
jeg ved at fyre en traad af, der hvert X.
minut tjekker alle timestamp paa filer
hvor jeg har cached klasser; findes filen
modificeret, sletter jeg den fra cachen
og den vil saa blive reloadet ved naeste
request paa den.
Jeg haaber, der er nogle der kan hjaelpe med dette problem, for jeg har virkelig brugt lang tid paa det efterhaanden og jeg synes ikke rigtig, jeg kommer meget videre med det.
Paa forhaand tak..
