JAVA Pb ClassLoader avec un chemin
Résolu
ortys4
Messages postés
254
Statut
Membre
-
step7 -
step7 -
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;
}
}
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:
- JAVA Pb ClassLoader avec un chemin
- Jeux java itel - Télécharger - Jeux vidéo
- Waptrick java football - Télécharger - Jeux vidéo
- Waptrick java voiture - Télécharger - Jeux vidéo
- Eclipse java - Télécharger - Langages
- Java apk - Télécharger - Langages
6 réponses
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.
Donc petite rectification de ma par et ca marche.
Vraiment grand merci de votre part.
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
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
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.
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.
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.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question