[Java] Pb avec le ClassLoader [Résolu]

Pb avec le ClassLoader [Résolu] [Java] - Java - Programmation

Marsh Posté le 05-12-2002 à 16:05:13    

bonjour,  
 
voila, j'ai fait des classes qui convertissent des données en provenances de bases de données vers XML accompagné d'un langage script de mon cru...
 
ces classes font appel a des classes qui sont specifiques a chaque application (derivant de classe abstract)...
 
quand j'utilise mon loader, ca charge nickel et j'utilise sans probleme les methodes de la classe abstraite.
 
Voila, la gueule de la classe abstraite:
 

Code :
  1. import java.util.*;
  2. public abstract class CDataBuilder implements SimuPlug,Comparator
  3. {
  4.  
  5.    public abstract Vector getFieldsList();
  6.    public abstract Vector getConstructorFields();
  7.    public abstract void   initCData(Vector v);
  8. }


 
La classe créée a partir de cette classe abstraite s'appelle CData et se trouve dans un répertoire a part...
 
Le code de mon classloader est le suivant (simple mais efficace, j'ai pas besoin de plus pour l'instant mais est-il complet???).  

Code :
  1. import java.io.*;
  2. import java.util.*;
  3. public class CFileClassLoader extends ClassLoader
  4. {
  5.    private Hashtable classes = new Hashtable();
  6.    protected String     classAccessPath;
  7.    protected File       fileClass;
  8.    protected String     className;
  9.  
  10.    public CFileClassLoader(String classN,String classAccess)
  11.    {
  12.       classAccessPath = classAccess;
  13.       fileClass = new File(classAccessPath);
  14.       className = classN;
  15.    }
  16.  
  17.    public Class getClassFromFile()
  18.    {
  19.       Class clas;
  20.       long fileSize = fileClass.length();
  21.       byte data[] = new byte[(int)fileSize];
  22.       try
  23.       {
  24.          FileInputStream fIn = new FileInputStream(fileClass);
  25.          fIn.read(data);
  26.          fIn.close();
  27.          clas = defineClass( className, data, 0, data.length );
  28.          resolveClass(clas);
  29.          classes.put(className,clas);
  30.       }
  31.       catch (Exception e)
  32.       {
  33.          clas = null;
  34.          System.out.println("Could not load class - " + e);
  35.       }
  36.      
  37.       return clas;
  38.    }
  39.  
  40. }


 
 
Le code d'appel (classe COpenSimu) est le suivant:
 

Code :
  1. CFileClassLoader clData = new CFileClassLoader("CData",lastOpenPath + "\\CData.class" );
  2.             classData = clData.getClassFromFile();
  3.            
  4.             try
  5.             {
  6.                Class.forName("CData",true,clData);
  7.                cdb = (CDataBuilder)(classData.newInstance());
  8.             }


 
et après ca appelle une classe commune qui elle fait appel a CData.
et la ca merde a la compil (a priori c'est normal), il me dit ne trouve pas le fichier CData.class...
 
d'ou vient le probleme? est-ce que ce que je veux faire est possible?
 
ps: ce que je veux faire en gros, c'est avoir quelques classes communes et 2 classes variables (CData et CSpecifique) chargées dynamiquement


Message édité par djok_fb le 11-02-2003 à 16:57:35
Reply

Marsh Posté le 05-12-2002 à 16:05:13   

Reply

Marsh Posté le 05-12-2002 à 16:41:19    

mais euh ... tu veux en fait spécifier la classe à utiliser au runtime?  
 
C'est pas comme ca qu'on fait hein ...


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 05-12-2002 à 17:36:46    

ben, en fait, j'ai déja des applis qui tournent et qui générent du XML a partir de la base.
 
Les applis utilisent toutes les classes CXMLGen, CEnvironment et CStringInterpreter qui sont communes.
Les applis possédent 2 classes (qui sont abstract) nommées CData et CSpecifique (qui dérivent de CDataBuilder et CSpecifiqueBuilder), ces classes sont utilisées dans CXMLGen.
 
Une fois cela fait, j'ai crée une interface de dév'...
et maintenant, je fais le module qui execute les scripts directement depuis l'interface, il suffit de selectionner le répertoire qui contient les 2 classes cdata et cspecifique.
Le classloader charge ces 2 classes.
L'interface appelle CXMLGen qui a besoin a la construction d'un objet CData. Ca, c'est ce que je voudrais pouvoir faire.

Reply

Marsh Posté le 06-12-2002 à 08:50:51    

DarkLord a écrit :

mais euh ... tu veux en fait spécifier la classe à utiliser au runtime?  
 
C'est pas comme ca qu'on fait hein ...


comment qu'on fait alors???

Reply

Marsh Posté le 06-12-2002 à 08:55:10    

faut il que je fasse des beans plutot que des classes?

Reply

Marsh Posté le 06-12-2002 à 09:10:25    

pourquoi créer ton propre ClassLoader ????
les .class existe déjà quand tu lance l'appli, non ?

Reply

Marsh Posté le 06-12-2002 à 09:37:09    

oui mais elles sont spécifiques a une appli (meme en-tete de methode, mais pas meme attribut et ni le meme corps)
il existe 2 versions (pour l'instant) du groupe CData/CSpecifique
ce sont ce groupe de class que je loade et que je voudrais pouvoir utiliser sans changer le classpath a chaque lancement de l'interface (user friendly pas developper friendly :p ).


Message édité par djok_fb le 06-12-2002 à 09:38:10
Reply

Marsh Posté le 06-12-2002 à 11:02:45    

djok_fb a écrit :

oui mais elles sont spécifiques a une appli (meme en-tete de methode, mais pas meme attribut et ni le meme corps)
il existe 2 versions (pour l'instant) du groupe CData/CSpecifique
ce sont ce groupe de class que je loade et que je voudrais pouvoir utiliser sans changer le classpath a chaque lancement de l'interface (user friendly pas developper friendly :p ).


 
mais tu fais de la réflexion ... Pas besoin de faire du classloading enfin :)


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 06-12-2002 à 11:21:05    

le truc, c'est que l'interface appelle une classe qui elle fait un import de CData (a la base, je devais pas en faire une utilisation dans une interface de test)

Reply

Marsh Posté le 11-02-2003 à 16:56:48    

ca y est j'ai trouvé ma solution, il suffisait d'aller sur le site de sun ( http://java.sun.com/docs/books/tut [...] Class.html ) pour que je trouve mon bonheur et des explications...

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed