Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1027 connectés 

  FORUM HardWare.fr
  Programmation
  Java

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°261866
djok_fb
C'était mieux avant!
Posté le 05-12-2002 à 16:05:13  profilanswer
 

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
mood
Publicité
Posté le 05-12-2002 à 16:05:13  profilanswer
 

n°261914
darklord
You're welcome
Posté le 05-12-2002 à 16:41:19  profilanswer
 

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
n°262153
djok_fb
C'était mieux avant!
Posté le 05-12-2002 à 17:36:46  profilanswer
 

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.

n°262706
djok_fb
C'était mieux avant!
Posté le 06-12-2002 à 08:50:51  profilanswer
 

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???

n°262709
djok_fb
C'était mieux avant!
Posté le 06-12-2002 à 08:55:10  profilanswer
 

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

n°262725
benou
Posté le 06-12-2002 à 09:10:25  profilanswer
 

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

n°262730
djok_fb
C'était mieux avant!
Posté le 06-12-2002 à 09:37:09  profilanswer
 

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
n°262801
darklord
You're welcome
Posté le 06-12-2002 à 11:02:45  profilanswer
 

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
n°262816
djok_fb
C'était mieux avant!
Posté le 06-12-2002 à 11:21:05  profilanswer
 

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)

n°306502
djok_fb
C'était mieux avant!
Posté le 11-02-2003 à 16:56:48  profilanswer
 

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...


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

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

 

Sujets relatifs
Applet, j'arrive pas a mettre une TextArea dedans.... [resolu][java] c quoi cette erreur (wrong version 48.0)?
Aide au java plizConvertir un projet Java en applet
[Java] Quelle classe pour stockage données volumineuse[JAVA] utilisation de JFileChooser dans un JPanel !
recupérer les pixels d'une image en java[Javascript] question pour des spécialistes.... [resolu]
Ou trouver des tutoriaux pour apprendre le java[JAVA] Pb avec Javamail
Plus de sujets relatifs à : [Java] Pb avec le ClassLoader [Résolu]


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR