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 :

problème d'héritage : pas la bonne version de la méthode exécutée


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Novembre 2004
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 18
    Par défaut problème d'héritage : pas la bonne version de la méthode exécutée
    Salut à tous,

    J'ai un problème d'héritage qui me perturbe, car il remet en cause une partir de ma compréhension de java, j'espère que quelqu'un saura me donner une explication...

    Au sein de mon équipe, nous avons un framework sur lequel reposent plusieurs applications : une des classes est abstraite (AbstractApplicationContext), et chaque application doit sous classer cette classe. La méthode getApplicationName() renvoie normalement le nom de l'application, définit dans un fichier de configuration.

    Dans mon application, j'ai besoin de gérer différemment le nom de l'application, donc j'override la méthode getApplicationName() dans MyApplicationContext.
    Le problème, c'est que dans ma jsp, quand je fais ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    AbstractApplicationContext ctx=AbstractApplicationContext.getCurrentContext(request);
    ctx.getApplicationName();
    ctx est bien de type MyApplicationContext (je le vois dans le debugger), mais c'est la version de la classe mère de getApplicationName() qui est exécutée. J'ai vérifié, les signatures des méthodes sont les même. D'ailleurs, quand je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MyApplicationContext ctx=(MyApplicationContext)AbstractApplicationContext.getCurrentContext(request);
    ctx.getApplicationName();
    ça fonctionnne bien, c'est la version définie dans MyApplicationContext qui est exécutée.

    Du coup, pour avoir un truc vraiment générique dans le framework, je suis obligé de passer par un truc pas beau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    AbstractApplicationContext tmpCtx=AbstractApplicationContext.getCurrentContext(request);
    Method method = Class.forName(tmpCtx.getClass().getName()).getMethod("getApplicationName", null);
    out.print(method.invoke(tmpCtx, null));
    Donc voilà, j'ai un truc qui fonctionne mais qui est moche, et je ne comprends pas pourquoi la version simple ne fonctionne pas. Si quelqu'un a une explication au fait que le premier bout de code ne donne pas le résultat escompté, je suis preneur ;-)

    merci d'avance

    --
    Vincent

  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,

    A tout hasard : la méthode getApplicationName() ne serait pas déclarée en static par hasard ???

    a++

  3. #3
    Membre averti
    Inscrit en
    Novembre 2004
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 18
    Par défaut
    bien essayé, mais non, getApplicationName n'est pas static. Par contre, dans la classe mère, j'ai ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    public String getApplicationName() {
    	return getApplicationProperties().getName();
    }
     
    protected static ApplicationProperties getApplicationProperties(){
     
    	if (applicationProperties == null){
    		WebApplicationContext contextUtils = WebApplicationContextUtils.getWebApplicationContext(servletContext);
    		applicationProperties = ApplicationProperties)contextUtils.getBean("applicationProperties");
    	}
    	return applicationProperties;
    }
    getApplicationName n'est pas static, mais appelle une méthode qui l'est.

    Dans la classe fille, j'ai ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	@Override
    	public String getApplicationName() {
    		return getCustomTheme().getDisplayName();
    	}

  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
    Etrange ! Très étrange ...

    Essayes de logger des infos dans la méthode getApplicationName(), et en particulier this.getClass() pour vérifier le type exacte de la classe courante...

    a++

  5. #5
    Membre averti
    Inscrit en
    Novembre 2004
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 18
    Par défaut
    j'ai fait le test. Dans ma jsp, j'appelle 2 fois getApplicationName(), de 2 manières différentes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <%=AbstractApplicationContext.getCurrentContext(request).getApplicationName()%>
    -
    <%
    AbstractApplicationContext tmpCtx = AbstractApplicationContext.getCurrentContext(request);
    Method method = Class.forName(tmpCtx.getClass().getName()).getMethod("getApplicationName", null);
    out.print(method.invoke(tmpCtx, null));
    %>
    Résultat ?
    dans les logs, les deux fois ça me dit que class= MyApplicationContext, et à l'écran, le premier m'affiche la valeur attendue si on passe par la classe mère, et la deuxième m'affiche la valeur de la sous classe.
    A n'y rien comprendre je vous dis !

  6. #6
    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
    C'est incompréhensible


    Est-ce que tu n'aurais pas modifié certaines propriétés de la classe ou de la méthode, comme la suppression d'un final ou un static par hasard ?

    a++

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 08/08/2012, 23h51
  2. [1.x] symfony n'installe pas la bonne version
    Par herzak dans le forum Symfony
    Réponses: 1
    Dernier message: 02/11/2010, 12h51
  3. \NeedsTeXFormat -> Je n'ai pas la bonne version.
    Par hoccha dans le forum Débuter
    Réponses: 1
    Dernier message: 15/12/2008, 18h00
  4. Réponses: 8
    Dernier message: 26/01/2006, 15h47
  5. [C#] Pb de DLL : ne trouve pas la bonne version
    Par sokette dans le forum Windows Forms
    Réponses: 7
    Dernier message: 12/04/2005, 15h59

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