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 :

Trouver toutes les classes implémentant une interface.


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    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 Trouver toutes les classes implémentant une interface.
    Bonjour,

    je cherche à trouver toutes les classes implémentant une interface.

    La méthode Class.getInterfaces() permet de trouver toutes les interfaces implémentées par une classe. Je veux faire l'inverse : trouver toutes les classes implémentant une interface.

    Quelqu'un sait-il comment faire?

    Cordialement,

  2. #2
    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,


    Ce n'est pas possible tel quel. Que veux-tu faire précisément ?

    a++

  3. #3
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 963
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Salut,


    Ce n'est pas possible tel quel. Que veux-tu faire précisément ?

    a++
    non trivial ne veut pas dire impossible…

    ce n'est ni simple ni rapide…
    mais il est parfaitement possible de scanner un bytecode pour détecter ce genre de choses…
    ou d'avoir son propre class loader pour tracker les classes recherchées…

    la solution dépendra du contexte…

    regardez déjà du côté de http://jboss.org/javassist/

  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
    Sauf que c'est super lourd à mettre en place, puisqu'il faudrait charger toutes les classes du classpath

    Il y a surement une solution alternative qui permettrait de résoudre son problème, mais pour cela il faut savoir ce qu'il veut faire !

    a++

  5. #5
    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 et merci pour vos réponses. Effectivement, Javassist a l'air très intéressant, mais je ne pense pas que ce projet me laissera le temps d'apprendre quelque chose d'aussi complexe pour si peu. Je l'étudierai probablement plus tard, par curiosité, à moins de trouver un code près à servir.

    J'espère que vous aurez la patience de lire mes explications. Accrochez vous, c'est parti.

    Je commence un projet utilisant les EJB. Le problème, c'est que le chef de projet n'aime pas avoir d'annotations dans les entités, car on utilise le modèle à plusieurs couches et les annotations font partie de la couche persistance.

    La solution est d'avoir pour chaque entité un bean dépourvu de toute annotation, et un décorateur de ce bean avec toutes les annotations. On a également une interface commune au bean et au décorateur, et une autre interface commune à ces décorateurs. De plus, les décorateurs doivent avoir deux constructeurs : un sans paramètre créant un nouveau bean et un autre prenant en paramètre le bean à utiliser.

    Par exemple, pour une entité "Info" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
     
    // L'interface des décorateurs EJB
    public interface IEjbBeanWrapper<T> {
    	T getBaseBean();
    }
     
    // L'interface de l'entité
    public interface IInfo {
    	public Integer getId();
    	public void setId(Integer id);
     
    	// Autres champs...
    }
     
    // Le javabean
    public class InfoImpl {
    	private Integer id;
    	// Autres champs...
     
    	public Integer getId() { return id; }
    	public void setId(Integer id) { this.id = id; }
    	// Autres champs...
    }
     
    // Le décorateur EJB
    @Entity
    public class InfoEjb implements IEjbBeanWrapper<IInfo>, IInfo {
    	private IInfo baseBean;
     
    	public InfoEjb() {
    		this.baseBean = new InfoImpl();
    	}
     
    	public InfoEjb(IInfo baseBean) {
    		this.baseBean = baseBean;
    	}
     
    	@Transient
    	public IInfo getBaseBean() {
    		return this.baseBean;
    	}
     
    	@Id
    	public Integer getId() {
    		return baseBean.getId();
    	}
     
    	public void setId(Integer id) {
    		baseBean.setId(id);
    	}
     
    	// Autres champs...
    }
    Toujours là? Les DAO peuvent donc enregistrer une Info en l'emballant dans le décorateur, via son constructeur prenant le bean de base en paramètre, et en enregistrant le décorateur comme si c'était une enité. Pour charger une info, on obtient du persistenceManager un InfoEjb dont il suffit d'utiliser la méthode getBaseBean.

    Ca se complique si un bean en référence un autre. Si un bean A a une propriété b de classe B, en chargeant A depuis la base, on obtiendra un décorateur AEjb. On peut obtenir le bean de classe A grâce à AEjb.getBaseBean(). Mais la propriété b de la classe A contient elle-même un BEjb! On peut bien sûr obtenir b sous forme de B grâce à BEjb.getBaseBean().

    Multipliez celà par le nombre d'entité et de relations entre entités du projet, et vous comprendrez pourquoi je cherche à automatiser l'emballage et le déballage.

    C'est là que l'API de reflexion de Java m'est utile. Pour déballer une entité, j'ai deux choses à faire:
    1. Appeler getBaseBean sur le Wrapper pour avoir le bean.
    2. Invoquer tous les getters du bean. Si ils renvoient un wrapper, ce qu'on peut tester avec instanceOf IEjbBeanWrapper, le déballer à son tour (il y a donc récursivité) puis utiliser le setter du premier bean pour remplacer le wrapper par le second bean.

    C'est l'opération inverse qui pose problème : l'emballage. Si je peux facilement tester qu'un objet est un wrapper en vérifiant si c'est une instance de IEjbBeanWrapper, je n'ai pas cette possibilité pour reconnaître un bean de base. Et je ne peux pas créer une interface à implémenter par les beans de base, puisque le but est que ces beans n'ait justement aucun code spécifique à la persistence.

    C'est pourquoi j'ai imaginé chercher toutes les classes implémentant IEjbBeanWrapper. Si je les trouve, je peux utiliser l'API de réflexion pour connaître le type de retour de leurs méthodes getBaseBean. Je peux ainsi établir la liste exhaustive des beans de base avec leur wrapper, ce qui résout le problème précédent.

    L'alternative est "d'enregistrer" tous les wrappers à la main, mais je préférerai limiter au maximum le travail des développeurs des entités.

    Voilà, j'espère avoir été compréhensible à défaut d'être bref.

  6. #6
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 963
    Par défaut
    AspectJ, cglib, javassist

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 28/09/2009, 17h41
  2. Trouver les classes implémentant mes interfaces
    Par Invité dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 23/12/2008, 09h11
  3. Réponses: 4
    Dernier message: 08/02/2008, 13h01
  4. Réponses: 5
    Dernier message: 26/07/2006, 17h01
  5. [Reflection] Obtenir toutes les classes implémentant une interface
    Par Pill_S dans le forum API standards et tierces
    Réponses: 4
    Dernier message: 20/04/2005, 16h48

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