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

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

  7. #7
    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
    Oui ne m'en veut pas mais je vais rester sur ma solution

    Merci encore pour ton aide !

  8. #8
    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
    Heu finalement cette solution comporte quelques petits soucis....

    En fait mes tests marchaient bien tant que je décompilais ma classe de test ( qui ne contient pas grand chose)

    Par contre, dès que je décompile une classe qui contient des imports vers des package persos, je me retrouve avec des NoClassDefFoundError sur les classes de ces package (normal vu que je copie uniquement ma classe à décompiler dans le répertoire temporaire).

    Au début j'avais l'erreur sur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Class laClasse = Class.forName(nomCompletClasse,true,loader);
    J'ai alors passé le boolean "initialize" de true à false, et cette instruction passe maintenant...

    par contre j'ai toujours mon erreur sur les instructions du type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Constructor[] constructeurs = theClass.getDeclaredConstructors();
    bref, chaque fois que je tente d'accéder au contenu de la classe.

    Au début, j'ai pensé à copier toute les classes importée dans la classe à décompiler dans le répertoire temporaire, mais certaines peuvent se trouver dans un endroit différent du classpath, dans un jar... donc ça marcherai pas souvent au final...

    il y a un moyen de charger la classe et d'accéder aux différents membre de la classe sans avoir à résoudre tous les imports??

    Merci d'avance !

  9. #9
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 483
    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 483
    Par défaut
    Citation Envoyé par legentil Voir le message
    il y a un moyen de charger la classe et d'accéder aux différents membre de la classe sans avoir à résoudre tous les imports??
    Pas avec les classloader. Dans ton cas, il faudar peut etre plutot t'orienter vers des analyseurs syntaxiques java qui te donnent les shéma de la classe sans qu'elle soit compilée (Le genre de truc que font les ides).

    Recherche dans les forums, il y a des discussion ou l'ont parle d'analyse de code java.

  10. #10
    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
    Je sens que ça va être compliqué cette affaire !

    En tout cas merci je vais jeter un oeil sur le forum !

  11. #11
    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
    Euh en fait je rame un peu depuis ce matin...

    Tout ce que je trouve sur le forum ou sur le net en général me ramènent sur javaCC ou sur le duo FLEX/CUP...

    J'ai essayé de regarder javaCC mais le problème c'est que j'ai l'impression que ces outils sont plus pour analyser un fichier d'entrée par rapport à des modèles définis dans un autre fichiers (enfin si j'ai bien compris)... en gros qui permettent de créer son propre langage et de le vérifier/compiler avec des règles qu'on met en place sois même.

    Moi tout ce que je veux, c'est avoir un arbre des différents éléments d'une classe à partir d'un fichier source java ( et la ligne du fichier source où ils sont déclarés ça serai chic ça ), du coup je suis un peu perdu dans ces outils aux possibilités énormes, je suis même pas convaincu que ce soit les outils les plus adaptés...

    Quelqu'un saurait t'il quel outil serai le plus adapté à mon besoin?

    Merci d'avance !

  12. #12
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 483
    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 483

+ 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, 16h42
  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, 15h49
  3. Tester si une classe est dans le classpath
    Par julien.63 dans le forum Langage
    Réponses: 6
    Dernier message: 09/01/2008, 13h37
  4. Réponses: 3
    Dernier message: 13/02/2007, 18h54
  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, 15h19

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