JAVA Pb ClassLoader avec un chemin

Résolu/Fermé
ortys4 Messages postés 254 Date d'inscription mardi 7 novembre 2000 Statut Membre Dernière intervention 26 septembre 2010 - 21 févr. 2008 à 14:44
 step7 - 1 mai 2009 à 00:43
Bonjour,
dans le cadre des mes cours, j'ai un projet à faire qui consiste en gros à refaire le célèbre EDI éclipse,bien sur en plus simple.
Mais si tôt commencé, si tôt confronté à un problème !!
Je vous explique, j'ai une classe réflexionPrg qui dois me retourner le contenu d'une classe (les méthodes, les constructeurs puis on verra par la suite) qu'on récupère à l'aide du chemin passé en paramètre.
Le problème est que sa marche seulement si la classe est dans le répertoire courant et que je passe en paramètre juste le nom de la classe, dans tous les autres cas une érreur est levé et le programme plante.
Avez vous une solution à me proposer, svp ...
---------------------------Mes classes (c'est le tout début de mon projet donc c'est encore clair----------------------------
import java.lang.Class;
import java.lang.reflect.*;

public class ReflexionPrg
{
public ReflexionPrg()
{}
public static void main(String[] args)
{
Class aEtudier = null;
Constructor tabConstructeur[];
Method tabMethod[];
EdiLoader monLoader = null;
try
{
monLoader = new EdiLoader();
aEtudier = monLoader.loadEdiClass("Courreur");

tabConstructeur = aEtudier.getConstructors();
tabMethod = aEtudier.getDeclaredMethods();

for(int i=0; i<tabConstructeur.length; i++)
{
System.out.println(tabConstructeur[i]);
}

for(int i=0; i<tabMethod.length; i++)
{
System.out.println(tabMethod[i]);
}
}
catch(ClassNotFoundException e)
{
System.out.println("Classe non trouve.");
}
}
}
-----------------------------------------------------------------------------------------------------
import java.io.*;

public class EdiLoader extends ClassLoader
{
public Class loadEdiClass(String aName) throws ClassNotFoundException
{
Class ret = null;
byte buffer[] = null;
System.out.println(aName);
InputStream is = getClass().getResourceAsStream(aName+".class");
if (is != null)
{
try
{
buffer = new byte[is.available()];
is.read(buffer);
ret = defineClass(aName, buffer, 0, buffer.length);
resolveClass(ret);
}
catch(IOException e)
{
throw new ClassNotFoundException(aName);
}
}
else
{
throw new ClassNotFoundException(aName);
}
return ret;
}
}
A voir également:

6 réponses

ortys4 Messages postés 254 Date d'inscription mardi 7 novembre 2000 Statut Membre Dernière intervention 26 septembre 2010 51
21 févr. 2008 à 15:46
Bah c'est ok, en fait il chercher Courreur.class.class !!!
Donc petite rectification de ma par et ca marche.
Vraiment grand merci de votre part.
1
kij_82 Messages postés 4089 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
21 févr. 2008 à 15:26
Bonjour,

En java quand tu fais : getResourceAsStream(...)
Automatiquement la jvm va chercher la ressource dans la liste des ressources de ton projet/programme.
Conclusion pour qu'une classe java soient "visible", c'est à dire que tu puisse l'appeler par son nom sans son chemin d'accès, il faut au préalable que ce chemin d'accès soit référencé dans le CLASSPATH de ton programme.
Sans ça, par défaut la jvm va essayer de trouver le classe java à la racine de ton application.

Conclusion, de la même manière qu'éclipse permet l'édition des propriétés d'un projet dans lesquelles apparait le CLASSPATH du projet, il faut que tu gère un CLASSPATH pour tes projets (dans ton futur ide), ou au moins pour le début, intégrer la notion de CLASSPATH (liste de répertoire dans lesquels essayer de trouver la classe java que tu veux loader.

Voilà, j'espère que ces explications t'aideront dans l'avancement de ton projet.
Bon courage
0
ortys4 Messages postés 254 Date d'inscription mardi 7 novembre 2000 Statut Membre Dernière intervention 26 septembre 2010 51
21 févr. 2008 à 15:39
Re
Déja merci pour votre réponse qui à pas mal éclairé ma lanterne, mais je vois pas trop comment le mettre dans mon code, j'ai modifié la methode de loadEdiClass de cette manière :
En fait j'ai rajouter une variable de type classPath (avec l'import qui va avec) mais ma class ce trouvant dans C:/Courreur.class n'est tjr pas trouvé. Si vous avez encore 5 min à me consacrer.

public Class loadEdiClass(String aName) throws ClassNotFoundException
{
Class ret = null;
byte buffer[] = null;
ClassPath cp = new ClassPath("C:/");

System.out.println(aName);
//InputStream is = getClass().getResourceAsStream(aName+".class");
try
{
InputStream is = cp.getInputStream(aName+".class");
if (is != null)
{
try
{
buffer = new byte[is.available()];
is.read(buffer);
ret = defineClass(aName, buffer, 0, buffer.length);
resolveClass(ret);
}
catch(IOException e)
{
throw new ClassNotFoundException(aName);
}
}
else
{
throw new ClassNotFoundException(aName);
}
}
catch(IOException e)
{
e.printStackTrace();
}
return ret;
}
Voila merci de votre aide.
0
kij_82 Messages postés 4089 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
21 févr. 2008 à 16:12
Oui effectivement puisque tu fais un 'getClass().get...' il faut juste spécifier le nom de la classe, sans son extension. D'ou l'erreur de load.
0
Bonjour
est ce que Vous avez terminez votre IDE?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ortys4 Messages postés 254 Date d'inscription mardi 7 novembre 2000 Statut Membre Dernière intervention 26 septembre 2010 51
30 juin 2008 à 10:26
Bonjour,

Oui on peut dire qu'il est terminé, mais il n'est pas utilisable pour développer. Maintenant si vous le voulez pour les sources, ya pas de soucis.
0
Bonjour ,
voilà j'ai travail sur le même projet que toi (création editeur) et la je suis un bloqué !!! j'ai vraiment besoin de ton aide si c' est possible .
merci
ps: lyacinek@hotmail.com (pour me contacté )
0