Newsgroup: it.comp.java
Titolo: NetworkClassLoader

CIAO A TUTTI.
Sto scrivendo una NetworkClassLoader che estende ClassLoader per
poter caricare classi dalla rete all'interno di un'applicazione
Java.
Il codice e' il seguente ma si verifica un NoClassDefFoundError nella
riga che invoca il metodo defineClass, qualcuno sa dirmi gentilmente
a cosa e' dovuto l'errore? grazie.
Se qualcuno sa dove posso eventualmente trovare il codice di
una NetworkClassLoader funzionante me lo faccia sapere, grazie.
import java.util.Hashtable; 
import java.net.URL;
import java.net.URLConnection;
import java.net.MalformedURLException;
import java.io.BufferedInputStream;
import java.io.IOException;
class NetworkClassLoader extends ClassLoader
{
   Hashtable cache = new Hashtable();
   private byte loadClassData(String name)[]
     throws ClassNotFoundException
   {
     // load the class data from the connection
     byte classBytes[] = null;
     try {
        URL url = new URL(name);
        URLConnection urlCon = url.openConnection();
        int len = urlCon.getContentLength();
        BufferedInputStream in =
(BufferedInputStream)                         urlCon.getContent();
        classBytes = new byte[len];
        in.read(classBytes);
     }
     catch (MalformedURLException e) {
       throw new ClassNotFoundException(name);
     }
     catch (IOException e) {
       throw new ClassNotFoundException(name);
     }
     return classBytes;
   }
   public synchronized Class loadClass(String name,
                                       boolean resolve)
                                       throws ClassNotFoundException
   {
      Class c = (Class) cache.get(name);
      if (c == null) {
         byte data[] = loadClassData(name);
  --->   c = defineClass(data, 0, data.length);  <----
         cache.put(name,c);
      }
      if (resolve)
         resolveClass(c);
      System.out.println( "<resolve OK>" );
      return c;
   }
}
-----------------------------------
Andrea e-mail: 
andr...@mbox.vol.it
-----------------------------------

 a cosa e' dovuto l'errore? grazie.
Ciao,
dato che nessun esperto ti ha ancora risposto, rilancio la questione con
una ulteriore domanda ed un abbozzo di risposta.
Io ho scritto del codice analogo per far scaricare ad un'applet una serie
di classi compresse in un file. Il mio codice funziona correttamente con
appletviewer, ma purtroppo non devo aver tenuto conto delle differenze nel
SecurityManager dei browser. Infatti, sia con IE che Navigator ottengo una
SecurityException (che cosa potrei aver sbagliato?).
Se ti interessa puoi andare su
http://www.geocities.com/SiliconValley/Lakes/3015/weeklyIdx.html
e scegliere 'Applet Loader'.
Per rispondere alla tua domanda: durante il debugging del mio codice
ottenevo un ClassFormatException (quindi forse non c'entra con quello che
capita a te) che era dovuto al fatto che BufferedInputStream sollecitato
con read restituisce al massimo 2048 bytes e sono necessari successivi read
per ottenere tutto il resto, anche se il buffer e' piu' capiente (se
qualche esperto mi sa gentilmente dire se anche qui ho fatto qualche errore
lo ringrazio anticipatamante). Quindi ho cambiato il codice in
  ByteArrayOutputStream buffer = new ByteArrayOutputStream(0xffff);
  BufferedInputStream b =
    (BufferedInputStream)new URL(base,library+".zip").getContent()
  ;
  byte[] chunck = new byte[2048];
  int bytes;
  while((bytes = b.read(chunck,0,2048)) > 0) {
    buffer.write(chunck,0,bytes);
  }
  ...
che funziona.
Grazie per l'attenzione e scusate la lunghezza
---------------------------------------------------------
Leonardo Boselli - TETRACTYS Software
Email: 
bos...@ivg.it
URL:   
http://www.geocities.com/SiliconValley/Lakes/3015/
---------------------------------------------------------