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

Java Discussion :

Class<T> t : comment executer et un méthode d'un type générique et avoir la valeur de retour ?


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2014
    Messages : 72
    Par défaut Class<T> t : comment executer et un méthode d'un type générique et avoir la valeur de retour ?
    Bonjour à tous

    j'ai cette 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
    public class MaClasse <T, M> {
     
    	@Autowired
    	private Class<T> membre1;
     
    	public Class<M> maMethodeQuiRenvoieUnResultat(Class<M> param1) {
               // Je veux pouvoir executer une methode qui est définie dans param1 (exemple cette méthode calcule et renvoie la date d'aujourd'hui+3 jours)
               // ça donnerait : Date d = param1.getDateDansTroisJours();
     
               // ENSUITE :
     
               // executer une méthode de membre1 qui prend une date en paramètre et renvoi un objet de type Class<M>
               // ça donnerait : Class<M> res = membre1.uneMethode(Date d);
            }
    }
    Quelle est la meilleur façon de pouvoir accéder et executer donc les méthodes définies donc "Class<T> membre1" et "Class<M> param1" ?

    En vous remerciant d'avance.

  2. #2
    Membre confirmé Avatar de Badshade23
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2014
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Décembre 2014
    Messages : 203
    Par défaut
    Salut,

    Tu es obligé de mettre ton paramètre en class générique ? Tu ne peux pas utiliser une class mère ou encore une interface que tes classes implémenteraient ?

    La méthode appelée dedans est toujours la même ? Ou elle change selon l'objet passé en paramètre ?

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2014
    Messages : 72
    Par défaut
    Merci pour ta réponse Badshade23,

    Effectivement je pourrais mettre une classe mère ou interface (j'y pas pensé dans mon contexte actuel d'utilisation).
    dans mon contexte le paramètre "param1" serait un un Service Springboot donc techniquement je peux faire hériter mes services depuis une classe service mere mais je ne sais si cela est cohérent étant donné que les services ne sont pas liés entre eux.

    de la même manière pour le membre "membre1" qui serait un Repository.

    quant à la méthode appelée, que ce soit pour le service ou le repository, elle ne change pas. mais j'aimerais aussi savoir comment faire dans le cas où elle changerait.

    Merci

  4. #4
    Membre confirmé Avatar de Badshade23
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2014
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Décembre 2014
    Messages : 203
    Par défaut
    Citation Envoyé par lenas_tshaleb Voir le message
    Effectivement je pourrais mettre une classe mère ou interface (j'y pas pensé dans mon contexte actuel d'utilisation).
    dans mon contexte le paramètre "param1" serait un un Service Springboot donc techniquement je peux faire hériter mes services depuis une classe service mere mais je ne sais si cela est cohérent étant donné que les services ne sont pas liés entre eux.
    Personnelement, je n'ai jamais eu besoin de donner un service instancier par spring en paramètre a une méthode. Mais dans ton cas si vraiment tu veux faire une méthode générique au lieu de faire une class mère pour tes services je ferai plutôt une interface qui contient la ou les méthode que tes service doivent avoir en commun.

    Citation Envoyé par lenas_tshaleb Voir le message
    mais j'aimerais aussi savoir comment faire dans le cas où elle changerai
    Si après tu veux faire une méthode qui est générique et qui exécute une méthode choisi au dernier moment de ton objet générique passé en paramètre (pas sur que se soit français tout ça ).
    Tu dois donner à ta méthode générique la méthode que celle*ci doit éxécuter (elle ne peut pas la deviner toute seule).

    Citation Envoyé par lenas_tshaleb Voir le message
    de la même manière pour le membre "membre1" qui serait un Repository.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    @Autowired
    	private Class<T> membre1;
    Je ne pense pas que tu puisses faire ça (à confirmer). Car tu demande à Spring de t'injecter un repository mais tu ne lui précise pas le quel ...
    Il ne pourra pas le deviner tout seul encore une fois.

  5. #5
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2014
    Messages : 72
    Par défaut
    Personnelement, je n'ai jamais eu besoin de donner un service instancier par spring en paramètre a une méthode. Mais dans ton cas si vraiment tu veux faire une méthode générique au lieu de faire une class mère pour tes services je ferai plutôt une interface qui contient la ou les méthode que tes service doivent avoir en commun.
    Je rectifie : param1 serait une Entity SpringBoot et non pas un service (au temps pour moi).

    Tu dois donner à ta méthode générique la méthode que celle*ci doit éxécuter (elle ne peut pas la deviner toute seule).
    Comment faire cela ? un exemple ?

    Je ne pense pas que tu puisses faire ça (à confirmer). Car tu demande à Spring de t'injecter un repository mais tu ne lui précise pas le quel ...
    Il ne pourra pas le deviner tout seul encore une fois.
    je doute aussi que cela marche car effectivement il essaye d'injecter quelque chose qu'il ne connait pas encore, je me demande si il y a une solution à ça en Java

  6. #6
    Membre confirmé Avatar de Badshade23
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2014
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Décembre 2014
    Messages : 203
    Par défaut
    Citation Envoyé par lenas_tshaleb Voir le message
    Comment faire cela ? un exemple ?
    J'ai fait ça il y a longtemps il faudrait que je retrouve mon code ... Mais dans mes souvenirs je passais une instance d'un objet et un string (nom de la méthode) en paramètre de la méthode. Puis via une librairie tierce je faisais une sorte d’exécuter dessus. Actuellement je n'ai jamais eu besoin de réitérer ce style de code et niveau d’abstraction est pour moi rarissime et souvent peut-être effectuer autrement.

    Citation Envoyé par lenas_tshaleb Voir le message
    je doute aussi que cela marche car effectivement il essaye d'injecter quelque chose qu'il ne connait pas encore, je me demande si il y a une solution à ça en Java
    Pour moi c'est impossible. Quand tu lances ton conteneur Spring, il va scanner tous les répertoires que tu lui as indiqués (via @SpringBootApplication ou autre) et à chaque fois qu'il tombe sur une annotation, il regarde avant d'injecter l'objet si celui-ci existe déjà dans son contexte ou non. Si il ne le trouve pas, il l'instancie et le place dans son contexte (si c'est un singleton). Ici Spring ne peut pas l'instancier, il ne connaît pas la classe. Le niveau d'abstraction est beaucoup trop haut et pour moi ce n'est pas à Spring de gérer ça. Mais plutôt à toi, plus tard de set cet attribut. Apres peut être en utilisant le XML pour instancier le Bean et non l'annotation ... Mais encore une fois je ne pense pas que ce sois réalisable.

    Tu ne peux pas traiter le problème autrement ? Pourquoi tu en es arriver à cette réflexion ?

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

Discussions similaires

  1. Comment Executer Une Classe Java Dans Une Page Jsp
    Par yazidi_marwen dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 10/05/2012, 13h20
  2. comment executer un script perl svp?
    Par nico72 dans le forum Langage
    Réponses: 8
    Dernier message: 13/07/2005, 09h51
  3. Réponses: 4
    Dernier message: 03/12/2004, 11h18
  4. [CR8.5] Comment executer ses propres requetes SQL.
    Par caviar dans le forum SAP Crystal Reports
    Réponses: 5
    Dernier message: 26/10/2004, 20h44
  5. [DEBUTANT]Comment executer un script sql
    Par peaceinpal dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 15/03/2004, 08h44

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