Rechercher : dans
Par :

JAVA Pb ClassLoader avec un chemin

Dernière réponse le 1 mai 2009 à 00:43:31 ortys4, le 21 fév 2008 à 14:44:00 
 Signaler ce message aux modérateurs

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;
}
}

Configuration: Windows XP
Internet Explorer 7.0

Meilleures réponses pour « JAVA Pb ClassLoader avec un chemin » dans :
[Firefox] plugin Java Jre de Sun VoirA) Les différentes variantes Java chez Sun B) Installation sous Mandriva Limited Edition 2005 ETAPE 1 ETAPE 2: Création du lien symbolique C) Installation sous debian lenny D) Installation sous ubuntu hardy heron A) Les différentes...
Installer Java sous Ubuntu VoirPar défaut, Firefox n'est pas fourni avec Java. Voici comment procéder pour l'installer: Ouvrez un terminal (Menu Applications > Accessoires > Terminal) et tapez: sudo aptitude install sun-java6-jre sun-java6-plugin ou sudo aptitude install ...
[Logiciel libre] Installation firefox 2.0+java+flash VoirInstallation firefox 2.0+java+flash en ligne de commande A. INTRODUCTION B. INSTALLATION FIREFOX 1. Création d'environnement 2. Téléchargement et vérification de la signature 3. Installation de Firefox 4. Démarrage de l'application C....
Télécharger Java Runtime Environment VoirJava Runtime Environment (JRE) installe la machine virtuelle Java, permettant de jouer en ligne, de discuter avec des personnes dans le monde entier, de calculer les intérêts de votre prêt immobilier ou de visualiser des images en 3D. Ces...
Java - Premier programme VoirPremière application avec Java La première chose à faire est de créer un simple fichier texte (sans mise en forme) et de taper les quelques lignes suivantes : // Votre premiere application en Java class FirstApp { public static void main...
Java - Les types de données VoirLes primitives Java est un langage orienté objet, c'est-à-dire que les éléments manipulés sont des classes, ou plus exactement des objets, c'est-à-dire des instances de classes. Toutefois ces objets contiennent des données possèdant un type (et...
Java - Les packages VoirIntroduction aux packages La programmation Java consiste à créer des classes. Or, étant donné qu'un programme est généralement développé par une équipe de programmeurs, c'est-à-dire plusieurs personnes, le fait de concaténer (mettre bout à bout)...

1

kij_82, le 21 fév 2008 à 15:26:27

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

~ N'oubliez pas la balise "Résolu" lorsque votre problème est... résolu :) ~

Répondre à kij_82

2

ortys4, le 21 fév 2008 à 15:39:42
  • +1

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.

Répondre à ortys4

3

ortys4, le 21 fév 2008 à 15:46:44

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.

Répondre à ortys4

4

kij_82, le 21 fév 2008 à 16:12:55

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.

~ N'oubliez pas la balise "Résolu" lorsque votre problème est... résolu :) ~

Répondre à kij_82

5

brpro, le 29 jun 2008 à 14:15:58

Bonjour
est ce que Vous avez terminez votre IDE?

Répondre à brpro

6

ortys4, le 30 jun 2008 à 10:26:44

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.

Répondre à ortys4

7

 step7, le 1 mai 2009 à 00:43:31

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é )

Répondre à step7