|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: May 2000
Messaggi: 1135
|
[JAVA] Problema sul caricamento dinamico delle classi
Ciao a tutti, ho un problema e vari domane da porvi sul caricamento dinamico delle classi.
Ho creato una piccola applicazione che esegue query su DB: questi DB possono essere di vario tipo SQL MYSQL ecc... ed appunto ogni DB ha una sua classe che eridita da una mia classe GeneralDBClass. ora finchè inglobo queste classi nel progetto non c'è problema ma quando uso i file .class x cariche queste classi inziano i problemi. Mi sono letto il thread in questa pagina ( http://www2.m okabyte.it/forum/thread.jsp?forum=4&thread=435&message=1358&q=636172696361726520 636c617373692064696e616d6963616d656e7465#1358 ) e bene o male ho capito come creare un mio loader delle classi. Domande: visto che le classi che devo caricare eridatano da una mia classe interna al progretto in un determinato package (package progett.Database) come faccio a compilarle x utilizzarle con add-on? Nel senso vorrei fare in modo che queste classi siano a parte rispetto al mio progetto quindi create seguendo la GenerlDbClass ma non compilate con il progretto intero quindi quando creo una nuova classe con un nuovo tipo DB devo oampilarle assieme al GenerlDbClass senza scrivere il package o come devo fare? Ho fatto alcune prove ma mi scazza sempre dando errori di "magic number" e penso sia quando carica la classe non vede il packege giusto o qualcosa di simile. E' un pò complicata la cosa da spiegare quindi spero sia chiaro a grandi linea cosa debbo fare. Grazie NapalM |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: May 2000
Messaggi: 1135
|
Ragazzi ho proprio bisogno del vs aiuto..
Mettendo un paio di breckpoint ho natotato una cosa strana classData = getClassBytes(className); if (classData == null) { throw new ClassNotFoundException(); } /* viene eseguito il parsing, e costruito l'oggetto class */ result = defineClass(className,classData, 0, classData.length); if (result == null) { throw new ClassFormatError(); } if (resolveIt) { resolveClass(result); } /* Si aggiorna la cache */ classes.put(className, result); System.out.println("Classe caricata : " +className); return result; } arriva fino a result=ecc... e qua passa direttamente da un'altra parte senza passare x il return e senza passare x i breckpoint messi nello statement successivo. Ora la mia classe si trova E:\Documenti\Corsi\MySI2\Driver\MySqlClass.class , la trova e calcola i bytes giusti ma credo sia in defineClass che scazza qualcosa. Allora className è MySqlClass, classData è byte[2780], e classData.lenght è 2780 come è in effetti la dimensione del mio file. Non sò proprio dove sbattere la testa NapalM |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Jul 2004
Messaggi: 1578
|
Ciao non ho letto tutto, comunque forse potrebbe esserti utile provare un altro approccio; tempo fa avevo letto questo "hack" che usava la classe UrlClassLoader per caricare classi da file locali (mentre UrlClassLoader lo permette solo per file remoti penso)
Codice:
import java.io.*;
import java.net.*;
import java.lang.reflect.*;
public class ClassPathHacker {
private static final Class[] parameters = new Class[] { URL.class };
public static void addFile(String s) throws IOException {
File f = new File(s);
addFile(f);
}
public static void addFile(File f) throws IOException {
addURL(f.toURL());
}
public static void addURL(URL u) throws IOException {
URLClassLoader sysloader =
(URLClassLoader) ClassLoader.getSystemClassLoader();
Class sysclass = URLClassLoader.class;
try {
Method method = sysclass.getDeclaredMethod("addURL", parameters);
method.setAccessible(true);
method.invoke(sysloader, new Object[] { u });
} catch (Throwable t) {
t.printStackTrace();
throw new IOException("Error, could not add URL to system classloader");
}
}
}
Ciao. |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: May 2000
Messaggi: 1135
|
Grazie end.is.forever ma credo che il codice sia esatto ma è all'atto della crostruzione della classe che qualcosa non quadra e non riesco a capire dove stà il problema anche xchè i parametri mi sembrano corretti.
NapalM |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: May 2000
Messaggi: 1135
|
Exception occurred during event dispatching:
java.lang.NoClassDefFoundError: MySqlClass (wrong name: mysi2/Database/MySqlClass) at java.lang.ClassLoader.defineClass0(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:537) at java.lang.ClassLoader.defineClass(ClassLoader.java:448) Ecco l'errore che è uscito ed è proprio quella sulla result=ecc.... NapalM |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
|
non potrebbe essere sbagliato il nome della classe???
tu hai detto ke si trova in E:\Documenti\Corsi\MySI2\Driver\MySqlClass.class, mentre nell'errore ti dice ke non trova mysi2/Database/MySqlClass se provi a sostituire database con driver nel path ke succede???
__________________
|
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: May 2000
Messaggi: 1135
|
Quote:
NapalM |
|
|
|
|
|
|
#8 |
|
Member
Iscritto dal: May 2003
Messaggi: 283
|
Non e' che sia un problema di "package" / "dir usata", cioè il package non corrisponde alla directory ??
Ovviamente e' solo un'idea in quanto non ho mai provato a realizzare una cosa del genere ma l'argomento mi interessa parecchio quindi quando trovi la soluzione sarebbe carino da parte tua fare un piccolo tutorial Ciao
__________________
/*** * Nulla è impossibile per chi non deve farlo ***/ |
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: May 2000
Messaggi: 1135
|
Quote:
Codice:
public static GeneralDbClass getDbInteraction(String dbClassName)
{
GeneralDbClass o=null;
try
{
SI2ClassLoader loader=new SI2ClassLoader(path, ".class");
Class c=loader.loadClass(dbClassName);
o=(GeneralDbClass) c.newInstance();
}
catch(ClassNotFoundException e){
System.out.println(e.getMessage());
}
catch(IllegalAccessException e)
{
System.out.println("errore in d3213");
}
catch(Exception e)
{
System.out.println(e.getMessage());
}
finally
{
return o;
}
|
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 21:08.




















