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

API standards et tierces Java Discussion :

Surcharger les librairies Java


Sujet :

API standards et tierces Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Inscrit en
    Mai 2002
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 4
    Par défaut Surcharger les librairies Java
    Bonjour,

    je cherche une solution pour surcharger des fonctions de l'API Java, tout en faisant en sorte que les classes qui utilisent les fonctions pensent qu'il s'agit des vraies fonctions de l'API Java.

    Par exemple, je veux surcharger le comportement de java.io.InputStream, sans avoir à modifier les fichiers source qui font appel à cela et dans lesquels on a:

    import java.io.*;
    et
    InputStream myStream = ...

    J'ai appris que la librairie org.objectweb.asm permettait de faire cela au runtime avec un class loader.
    Mais je me demandais si c'était possible autrement (notamment à la compilation, en remplaçant les références à InputStream par autre chose).

    Merci pour vos suggestions.


  2. #2
    Membre Expert
    Avatar de afrikha
    Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    1 600
    Détails du profil
    Informations personnelles :
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2005
    Messages : 1 600
    Par défaut
    Sans modifier les sources ça va étre difficile. Il faut savoir que "java.*" et "javax.*" pour les noms de packages sont résérvés pour Sun.
    Je ne vois aucune manière de faire mais ça ne veut pas dire qu'il y en a pas.


    Mes publications
    Lisez
    Les régles du forum
    Pensez au bouton

  3. #3
    Membre éprouvé
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Par défaut
    Salut,

    je ne crois pas que ce soit possible, la seule façon que je voie est de faire hériter une classe fille de ta création et de surcharger à la main...

    bien à toi !

    mavina

  4. #4
    Membre expérimenté Avatar de hydraland
    Profil pro
    Développeur Java
    Inscrit en
    Mai 2006
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mai 2006
    Messages : 179
    Par défaut
    Salut,

    Pour faire ce que tu veux je vois 3 possibilités :
    -> Soit tu écrit une applie qui modifie le byte code de tes classes après compilation et qui remplace les occurences des classes java(celles que tu veux surcharger), par des classes à toi. Le plus simple je pense c'est de remplacer les new ClasseJava par new TaClasse avec Taclasse qui hérite de ClasseJava. La théorie à l'air simple mais je pense que c'est assez compliqué à faire.
    -> Sinon l'autre moyen comme tu l'indique c'est en écrivant ton propre ClassLoader. Jette un coup d'oeil sur la librarie http://www.csg.is.titech.ac.jp/~chiba/javassist/.
    Elle te permet de modifier du code dynamiquement. Tu peux au choix soit modifier le comportement des classes java (pas évident et surtout je ne pense pas que celà soit très légal), soit modifier dynamiquement tes classes en remplacent les occurences des classes java par tes classes.
    -> Soit écrire des classes portant le même nom(package compris) que les classes java que tu souhaite remplacer et les mettres au début de ton bootclasspath. Je pense aussi que cette solution n'est pas très légal.

  5. #5
    Futur Membre du Club
    Inscrit en
    Mai 2002
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 4
    Par défaut
    hydraland, merci pour ta 3eme proposition qui est la plus intéressante dans mon cas.

    -> Soit écrire des classes portant le même nom(package compris) que les classes java que tu souhaite remplacer et les mettres au début de ton bootclasspath. Je pense aussi que cette solution n'est pas très légal.

    Ça marche bien pour remplacer une classe du jre par une autre. Mais par contre, je ne vois pas comment faire pour hériter du code déjà existant pour cette classe.

    Par exemple, j'ai remplacé java.math.BigInteger par ma propre classe, mais je ne veux pas réécrire toute cette classe.
    Et je ne vois pas comment faire cela.

    Merci pour vos suggestions.

  6. #6
    Membre éprouvé Avatar de Xavinou
    Inscrit en
    Mai 2005
    Messages
    135
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 135
    Par défaut
    Par curiosité, c'est quoi le but ? Parce que ça semble quand même risqué étant donné que les classes du jdk s'utilisent les unes les autres...

    Pourquoi comme cela a été proposé plus haut ne pas utiliser l'héritage ?

  7. #7
    Futur Membre du Club
    Inscrit en
    Mai 2002
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 4
    Par défaut
    jowo:
    dans la solution que j'évoquais dans mon 1er message, on utilise en effet un classloader, mais il faut de plus une librairie comme org.objectweb.asm, ou probablement http://www.csg.is.titech.ac.jp/~chiba/javassist/ comme le disait hydraland.
    C'est nécessaire pour changer uniquement des partices des classes que l'on load. C'est ce que j'utilise pour faire une classe qui a le même nom que InputStream, qui possède le comportement de InputStream mais qui a quelques différences dans ses fonctionnalités.
    Je ne vois pas comment faire ça sans ce type de librairie.

    ypicman:
    Recompiler la classe InputStream du sdk serait en effet une solution (qui a tout de même des inconvénients au niveau du déploiement).
    Est-ce que les sources de l'API Java fournie avec la machine virtuelle sun sont publiques ?
    Pour ce qui est de tes commentaires sur l'utilité et la débilité de faire ça, le forum n'est pas fait pour ça. Donc si ça ne te plait pas, ne réponds pas.

    Comme je l'ai déjà dit précédemment, je dois simuler une autre machine virtuelle dont le comportement est un peu différent. Pour autant, je ne dois pas modifier le source des classes executées, donc je ne peux pas remplacer les références à java.io.InputStream par une classe que j'aurais créée moi même.

  8. #8
    Membre Expert
    Avatar de alexismp
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 503
    Par défaut
    La modification de la JVM n'est pas autorisée selon la license binaire qui l'accompagne.

    Seules les classes décrites ici peuvent être redéfinies par une autre implémentation:
    http://java.sun.com/j2se/1.4.2/docs/guide/standards/

  9. #9
    Gfx
    Gfx est déconnecté
    Expert confirmé
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Par défaut
    Le bootclasspath est à mon avis la solution la plus simple et la plus pratique. Je ne crois pas qu'elle entraîne quelconque problème légal mais je ne peux le dire avec certitude. Alexis, si tu as une info là desssus...

    Note : Nous utilisons le bootclasspath chez Sun lorsque nous travaillons sur les API du JDK. Si vous voulez corriger des bugs du JDK au sein du projet Peabody (cf http://mustang.dev.java.net) c'est la solution la plus simple pour ne pas avoir à recompiler tout le JDK.

  10. #10
    Membre Expert
    Avatar de alexismp
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 503
    Par défaut
    No problemo avec le bootclasspath.

Discussions similaires

  1. Les librairies en Java..
    Par Invité dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 27/12/2011, 02h11
  2. [GeotoolKit] Géoréférencement : manipuler les projections avec la librairie Java GeotoolKit
    Par eclesia dans le forum SIG : Système d'information Géographique
    Réponses: 0
    Dernier message: 09/05/2010, 13h41
  3. les librairies pour gerer et manipuler les graphes en Java
    Par juveto dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 08/04/2009, 14h46
  4. Connaitre les librairies Java
    Par Rex Es dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 01/04/2009, 08h03
  5. Librairie java pour piloter les graveurs de CD/DVD
    Par Kris* dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 10/01/2007, 18h14

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