IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java Discussion :

Charger une classe en dehors du classpath


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 187
    Par défaut Charger une classe en dehors du classpath
    Bonjour !

    Je suis en train de développer un décompilateur en java...
    J'utilise Jad et tout se passe pas trop mal jusque là :
    L'utilisateur sélectionne un .class, ça envoie la commande à jad qui crée un fichier java temporaire, que je relie et que j'affiche dans un champ texte... bref, rien de miraculeux, et ça marche bien !

    là où ça se complique, c'est que je voudrais afficher un arbre à gauche indiquant tous les membres et méthodes de la classe (pour ensuite en faire des liens vers le java façon outline d'éclipse)
    J'ai donc pensé à charger le .class, et ensuite grâce à la classe récupérer tout ce qui m'intéresse en passant par getConstructors(), getDeclaredFields()...

    Le problème vient du fait que je n'arrive pas à charger ma classe qui du coup peut être n'importe où...

    J'ai pas mal cherché sur google et tout ce que j'ai trouvé, c'était pour charger des classes contenues dans un .jar, ou des classes incluses dans le classpath

    Je me suis un peu penché sur le ClassLoader et URLClassLoader, mais rien de bien concluant...

    du coup quelqu'un sait si il existe une façon de charger un .class qui se trouve n'importe où?

    Merci

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Utilise un URLClassLoader que tu fait pointer sur le .jar de la librairrie en question (ne pas oublie lers libraires de soutiens si tu veux pouvoir charger ces classes), ensuite tu passe par tonclassloader.forName() pour récupérer la classe en question, et c'est partit

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 187
    Par défaut
    Merci pour cette réponse rapide mais j'ai peur de ne pas comprendre

    Mon problème vient justement du fait que mon .class n'est pas inclus dans un jar, c'est juste un fichier .class enregistré quelque part sur le pc...

    Ou bien tu parles d'un autre .jar ??

  4. #4
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    si c'est juste un .class isolé, tu peux le chargé un incluant sont dossier contenant. Exemple:

    ta classe est machin.bidule.truc.MaClasse
    le fichier est /home/tchize/jad/machin/bidule/truc/MaClasse.class

    tu passe à urlclassloader l'url correspondant à "/home/tchize/jad/" puis tu fais un classloader.forName("machin.bidule.truc.MaClasse");

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 187
    Par défaut
    Merci tchize_ ça marche !
    Pour ceux que ça peut intéresser, je poste mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    try {
    			URLClassLoader loader = new URLClassLoader(new URL[]{new File("C:\\Documents and Settings\\anedjary\\Bureau\\workspace\\logiciel\\_TESTS").toURL()});
    			System.out.println(Class.forName("chargementclasse.packageacharger.Classe",true,loader).getName());
    		} catch (MalformedURLException e) {
    			e.printStackTrace();
    		} catch (ClassNotFoundException e) {
    			e.printStackTrace();
    		}
    sachant que le fichier que je décompile est C:\Documents and Settings\anedjary\Bureau\workspace\logiciel\_TESTS\chargementclasse\packageacharger\\Classe.class

    (Oui je sais c'est pô propre du tout d'avoir son workspace sur le bureau et alors quoi ??)

    Seulement voilà j'aurai encore un petit souci :
    j'aurai souvent à décompiler des .class qui serons pas à leur place, genre que je viens de télécharger d'un FTP jusqu'à mon bureau... du coup l'arborescence des dossiers contenant mon .class ne correspond pas du tout au package de la classe...

    Je pense contourner le problème en faisant une copie du .class dans un répertoire temporaire en recréant l'arborescence voulue au dessus, et de charger la copie. Cette solution me semble moyennement propre mais elle fera très bien l'affaire si ce n'est pas possible de faire mieux !

    Par contre, si quelqu'un a des suggestions autres pour contourner le problème, je suis preneur !

  6. #6
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    c'est la solution la plus facile à coder. L'autre solution c'est de recoder une partie des méthodes de urlclassloader qui vont chercher le binaire en fonction du classname, c'est plus chiant à faire il me semble

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Charger une classe contenue dans un .dll
    Par NLS le pingouin dans le forum Langage
    Réponses: 4
    Dernier message: 21/05/2010, 15h42
  2. Charger une classe dans le classloader courant
    Par hugo123 dans le forum Général Java
    Réponses: 9
    Dernier message: 10/06/2008, 14h49
  3. Tester si une classe est dans le classpath
    Par julien.63 dans le forum Langage
    Réponses: 6
    Dernier message: 09/01/2008, 12h37
  4. Réponses: 3
    Dernier message: 13/02/2007, 17h54
  5. [ClassLoader] Charger une classe extérieure au projet dynamiquement
    Par tiboudchou dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 17/01/2007, 14h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo