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

Langage Java Discussion :

implementer dynamiquement une interface se trouvant dans un JAR


Sujet :

Langage Java

  1. #1
    Invité
    Invité(e)
    Par défaut implementer dynamiquement une interface se trouvant dans un JAR
    Bonjour à tous,

    J'aurais voulu savoir s'il était possible d'implémenter dynamiquement une interface, ainsi que ses méthodes.

    Pour mieux comprendre :
    Lorsque je lance mon appli, je charge dynamiquement un fichier Jar ou je peux donc instancier des objets situés dans le JAR.
    Mais une classe de mon appli a besoin d'implémenter une interface située dans ce JAR...Et là je bloque...

    J'ai regardé un peu les classes InvocationHandler et Proxy...suis-je sur la bonne voie ? Je ne comprends pas très bien leur fonctionnement...

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    961
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 961
    Par défaut
    Bonjour,

    Je ne suis pas sûr de bien vous suivre, en particulier sur ce que vous entendez par "dynamiquement".

    Pour qu'une classe puisse implémenter une interface, il faut qu'elle soit connue au moment de la compilation (de la classe). Si vous ne disposez pas du jar contenant l'interface lors de la compilation de votre programme, vous êtes cuit.

    La seule solution de rechange que je vois serait de ne pas compiler la classe en question en même temps que le reste du programme. Au lieu de ça, vous conservez son code source dans l'exécutable, et vous attendez d'avoir le jar pour compiler votre classe en appelant javac comme un programme externe, après quoi vous la chargez dynamiquement à son tour. Il y a deux inconvénients :
    1. le compilateur doit être disponible sur la machine cible,
    2. ce serait particulièrement sportif à réaliser.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Excusez moi si je ne suis pas très clair....

    Voila ce qu'il se passe, lorsque l'application est lancée, elle demande à l'utilisateur de choisir entre différents modules dont celui qui utilise le JAR. Si le JAR est choisi, il est alors ajouté au ClassPath, l'ajout se fait dynamiquement.

    En sachant cela possible, je peux alors au niveau de la programmation de mon appli charger et instancier les classes dont j'ai besoin se trouvant dans le JAR en faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Class myClassInJAR = Class.forName("myPackage.myClassName);
    Ainsi après je peux invoquer des méthodes de la classe sur un objet de type myClassInJAR :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Object myObject = myClassInJAR.newInstance();
    C'est cela que j'entends par dynamique.

    Et donc je me posais la question pour une interface, s'il n'y avait pas la même chose, charger dynamiquement une interface ?

    Sur le net j'ai vu la chose suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public class MyClass implements InvocationHandler {
    ...
        public Object invoke(Object arg0, Method arg1, Object[] arg2) throws       Throwable {
    	return null;
        }
    ...
    }
    Est ce la facon de charger dynamiquement un interface se trouvant dans un JAR ?

    Merci de toutes vos réponses

  4. #4
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    Proxy et InvocationHandler permettent en effet d'implémenter dynamiquement une interface... mais il faudrait savoir ce que tu veux en faire et pourquoi tu as besoin de cela ?

    Qui utilisera les méthodes de l'interface ? Si c'est toi qui va les appeler via la reflection, je dois dire que j'ai du mal à comprendre l'intérêt de la chose

    a++

  5. #5
    Invité
    Invité(e)
    Par défaut
    Je vais éclaircir quelques points...affaire à suivre

    Merci pour vos réponses

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    961
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 961
    Par défaut
    Etes vous sûr d'avoir besoin de faire aussi compliqué? Sauf exception, la conception habituelle consiste à avoir l'interface dans un jar à part, à inclure dans le classpath de tous les modules à la compilation comme à l'exécution.

  7. #7
    Invité
    Invité(e)
    Par défaut
    Je vais me renseigner auprès des personnes qui ont développés ce fichier JAR, car en ce qui me concerne je l'exploite uniquement afin de chasser les problèmes.

    Sinon une question : Si on ne peut pas implémenter une interface "dynamiquement", a quoi servent les classes Java InvocationHandler et Proxy ?

    Merci.

  8. #8
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par BugFactory Voir le message
    Etes vous sûr d'avoir besoin de faire aussi compliqué? Sauf exception, la conception habituelle consiste à avoir l'interface dans un jar à part, à inclure dans le classpath de tous les modules à la compilation comme à l'exécution.
    En fait cela dépend de ce qu'il veut faire avec cela... mais cela peut être utile !

    Citation Envoyé par EtudiantJm Voir le message
    Sinon une question : Si on ne peut pas implémenter une interface "dynamiquement", a quoi servent les classes Java InvocationHandler et Proxy ?
    Cela sert bien à implémenter dynamiquement une interface...

    Mais il faut savoir pourquoi tu veux faire cela ? Ce n'est pas très clair dans tes messages...

    Il faudrait que tu explique plus précisément ce que tu veux faire.


    a++

  9. #9
    Membre éclairé

    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 766
    Par défaut
    Class.forName() associé à ClassLoader me semble pas mal.
    http://www.javageeks.com/Papers/ClassForName/index.html -> click sur Paper pour avoir l'article au complet.

  10. #10
    Invité
    Invité(e)
    Par défaut
    Si je veux faire cela c'est que les personnes qui ont développés le fichier JAR n'ont pas de traitement particuliers à faire.
    C'est mon application qui doit implémenter les fonctions, c'est pas moi qui fait l'appel aux méthodes implémentées.

    En fait pour mieux voir la chose, le fichier JAR est un client utilisé via mon application qui me sert à valider des tests, qui va se connecter à un serveur.
    Puis le serveur retourne une réponse au client et le résultat s'affiche dans mon appli.

  11. #11
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par EtudiantJm Voir le message
    En fait pour mieux voir la chose, le fichier JAR est un client utilisé via mon application qui me sert à valider des tests, qui va se connecter à un serveur.
    Puis le serveur retourne une réponse au client et le résultat s'affiche dans mon appli.
    Ce que je ne comprend pas, c'est pourquoi tu veux passer par du code dynamique ? Pourquoi ne pas simplement ajouter ce jar à ton classpath et implémenter l'interface normalement ?


    L'implémentation dynamique d'interface n'est utile que si tu dois faire du code générique et commun. Pas pour un implémentation spécifique...


    a++

  12. #12
    Invité
    Invité(e)
    Par défaut
    C'est bête mais tout simplement parce qu'on m'a demandé de charger le JAR de façon dynamique. Si on en a pas besoin, on ne l'utilise pas...
    Voilà pourquoi je dois faire ça dynamiquement...

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

Discussions similaires

  1. Utiliser/appeler une image se trouvant dans le .jar (le classpath)
    Par Alba.1337 dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 08/06/2012, 14h04
  2. Réponses: 4
    Dernier message: 07/05/2007, 21h38
  3. Réponses: 7
    Dernier message: 06/01/2007, 20h16
  4. Monter une partition se trouvant dans un fichier
    Par Celelibi dans le forum Administration système
    Réponses: 3
    Dernier message: 02/04/2006, 18h56
  5. utiliser une variable se trouvant dans un autre .c
    Par richard_sraing dans le forum C
    Réponses: 2
    Dernier message: 18/03/2006, 11h59

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