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 :

[Réflection]ClassLoader personnalisé et isAssignableFrom


Sujet :

API standards et tierces Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 6
    Par défaut [Réflection]ClassLoader personnalisé et isAssignableFrom
    Bonjour,


    Mon objectif est de charger et lister les classes contenues dans un fichier jar, puis parmi elles trouver celles qui implémentent certaines interfaces spécifiques.
    Je vais probablement finir par utiliser un URLClassLoader puisqu'il fait la partie principale du boulot, mais je voudrais vraiment comprendre d'où vient mon problême, juste pour ma culture Java

    En guise de référence, voilà la hierarchie de classes impliquées dans mon problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public abstract class cero.games.uno.AbstractAI extends UnoPlayer implements AIPlayer, /* autres interfaces */
    public class cero.games.uno.UnoPlayer extends PlayerBase
    public class cero.games.base.PlayerBase implements Player, /* autres interfaces */
    public interface cero.games.AIPlayer extends Player
    public interface cero.games.Player
    Commençons : j'ai implémenté mon propre ClassLoader pour charger les .class contenus dans des fichiers jar (et les lister par la même occasion), et j'ai chargé avec ce ClassLoader une classe implémentant AbstractAI.
    A propos de la hiérarchie des ClassLoader : le bootstrap ClassLoader a chargé seulement les classes cero.games.Player et cero.games.AIPlayer qui sont référencées par les classes utilisées dans le main.
    Cependant, le reste de cero.games et cero.games.base est chargé par une instance de mon ClassLoader, celui-ci ayant le bootstrap ClassLoader comme parent.
    Enfin, une autre instance de mon CL charge le package cero.games.uno, en ayant le CL précédent comme parent.
    Grâce à cette hiérarchie, je respecte facilement les dépendances vers les classes contenues dans les packages supérieurs (par exemple quand cero.games.base dépend de cero.games).

    Comme vous pouviez voir dans les déclarations plus haut, AIPlayer étends Player et est implémentée par AbstractAI. Cependant, quand j'utilise isAssignableFrom dans ce morceau de code, où 'c' est une classe dérivant de AbstractAI (et donc implémentant à la fois AIPlayer et Player), seul le 2eme test est vrai.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (AIPlayer.class.isAssignableFrom(c)) /* évalué faux */
    	aisClass.add(c.asSubclass(AIPlayer.class));
    else if (Player.class.isAssignableFrom(c)) /* évalué vrai */
    	playerClass = c.asSubclass(Player.class);
    J'ai vérifié avec un débuggueur : assez logiquement, AIPlayer et Player sont tous les deux chargés par le bootstrap ClassLoader (la classe contenant ce morceau de code n'est pas chargée dynamiquement et fait référence à Player.class et AIPlayer.class, ces deux Class sont donc nécessités dès le démarrage), tandis que c a bien été chargée par mon ClassLoader personnalisé comme prévu.

    Puisque c implémente à la fois AIPlayer et Player, je supposais qu'il serait les deux "assignableFrom" c. Mais seulement un des deux test est vrai, et c'est cela que je ne comprend pas.
    Peut-être que j'ai mal compris comment isAssignableFrom marche : si vous avez un cours, je suis preneur !


    Merci à vous de m'éclairer, je ne vois vraiment pas ce qui provoque ce comportement


    PS : Au cas où ça puisse aider, j'utilise Eclipse 3.1

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 6
    Par défaut
    En regardant un peu mieux, j'ai trouvé mon problême : AIPlayer était chargé deux fois, dans deux ClassLoader différents, d'où l'erreur du test
    -> dormir, c'est mieux pour réfléchir xD

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 16/04/2009, 01h43
  2. [VB.NET] Evenement par défaut sur controle personnalisé
    Par anthony70 dans le forum Windows Forms
    Réponses: 7
    Dernier message: 31/08/2004, 16h19
  3. Réflection - projected texture
    Par Dranor dans le forum DirectX
    Réponses: 2
    Dernier message: 29/05/2004, 13h35
  4. [CR]Help numero page personnalisé
    Par juelo dans le forum SAP Crystal Reports
    Réponses: 4
    Dernier message: 09/01/2004, 16h59
  5. Réponses: 9
    Dernier message: 14/10/2003, 15h35

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