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 :

avoir le type du paramétre générique par réflexion


Sujet :

API standards et tierces Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    185
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 185
    Par défaut avoir le type du paramétre générique par réflexion
    Bonjour,

    j'ai une classe:
    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
     
    public class AbstractJpaDao<ENTITY, ID extends Serializable> implements
    		AbstractDao<ENTITY, ID> {
     
    	@PersistenceContext
    	private EntityManager manager;
     
    	private Class<ENTITY> entityClass;
    	private String entityName = "";
     
    	@PostConstruct
    	public void init() {
     
                    //getClass().getTypeParameters()[0].getName();
    	   }
     
    //CRUD
    	}
    je voudrais utiliser cette classe dans mes services:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    @Service("depManager")
    @Transactional
    public class DepartmentServiceImpl implements DepartmentService {
     
    	@Autowired
                 private AbstractDao<Department, Long> departmentDao;
                 @Autowired
                 private AbstractDao<Employe, Long> employeDao;
     
    ....
    }
    j'aimerai savoir si par réflexion je peux avoir le type de mon premier parametre générique (Department, Employe) dans la méthode init de l'AbstractJpaDao.

    Merci par avance de vos suggestions

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    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 482
    Par défaut
    Non, tu ne peux pas vraiment. Cette information (le type du generic) n'est utilisé que par l'appelant et sert uniquement pour la compilation, tout le code de ton AbstractJpaDao et AbstractJpaDao est compilé comme si le type était <Object, Serializable>, rien d'autre.

    Seules les information dynamiques te sont accessible, comme par exemple le type réel des objets qui te son passé en paramètre, via leur instance, mais ceci ne donne qu'une vague idée car on ignore pour autant. Exemple assez conci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public class Machin<X> {
        public init() {
           // impossible de connaitre le type réel de X!
        };
        public void truc(X x){
           System.out.println(x.getClass().getName());
        }
        public static void main(String[] argv){
           Machin<List> m = new Machin<List>();
           m.truc(new ArrayList());  // affichera java.util.ArrayList, c'est pas parfait mais donne une idée
        }
    }
    Le seul cas que je connaisse où du code connait c'est information est celui-ci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public class Truc extends Machin<List> {
    //.....
    }
    il est possible (le code est quelque part sur le fofo) de récupérer "java.util.List" depuis une instance de Truc, mais uniquement depuis une instance de Truc, et dans ce cas, on sais déjà très bien qu'on travaille avec List donc on est pas plus avancé (ca sert uniquement pour les abstract ou l'on prend comme convention que les concrete seront typées et non generic). C'est possible car c'est le seul cas ou le type réel du generic a besoin d'etre stocké explicitement dans le .class, pour faire le header de classe de Truc ^^

    edit: ben voilà, c'est du code de Rei ichido dont je parlait

  3. #3
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    Si tu ne définis pas explicitement une classe qui étende ta classe abstraite, en fixant le typage générique, alors la réponse est non : le compilateur efface les génériques, ils ne sont pas disponibles au runtime.

    Par contre si tu crées des classes, en les laissant vides ensuite (elles ne font qu'étendre ta classe qui pour le coup est réellement abstraite), alors tu peux utiliser ce genre de chose :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    public class DepartmentDAO extends AbstractDao<Department, Long> { }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    	@PostConstruct
    	public void init() {
               ((ParameterizedType) 
                 getClass().getGenericSuperclass()).getActualTypeArguments()[0];	
    	   }
    Évidemment ça t'oblige à définir autant de classes filles que tu auras de cas, mais tu peux laisser tout le code dans la même classe abstraite (et donc pas besoin de définir dans chaque classe fille une méthode qui te renvoie les classes).

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    185
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 185
    Par défaut
    Merci beaucoup,

    En fait j'ai fait comme tu as suggeré Rei Ichido, et ma question etait juste pour éviter d'avoir des coquilles vide de Dao. comme disait tchize en compilation ç a se passe comme si c'était <Object, Serializable>, donc j'ai pas trop le choix.

    Encore un fois merci

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 26/05/2015, 09h49
  2. [Générique] Passer un type en paramètre
    Par WebManiaK dans le forum PL/SQL
    Réponses: 3
    Dernier message: 16/04/2011, 18h57
  3. Réponses: 3
    Dernier message: 06/01/2010, 09h47
  4. retour du type générique avec réflexion
    Par maxeur dans le forum C#
    Réponses: 2
    Dernier message: 03/07/2009, 14h05
  5. Réponses: 2
    Dernier message: 08/10/2006, 11h44

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