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 :

Caster vers la classe mère


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2007
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2007
    Messages : 89
    Billets dans le blog
    2
    Par défaut Caster vers la classe mère
    Bonjour,

    Voila le pb que je cherche à résoudre sans y arriver

    Class A {.....}
    Class B extends A {.....}

    Plus loin, dans une partie du code que je ne peux modifier j'ai ceci

    C.class.getDeclaredMethod("setA",new Class[]{A.class}).invoque(_obj,new Object[]{a});

    Hors, l'invocation sous cette forme exige le type exact ce que je n'ai pas (j'ai B)

    D'ou ma question => Comment puis je avoir une instance de A à partir d'une instance de B ?

    (Le code => A a = (A)b => renvoie comme classe B)

    Merci par avance de votre aide

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par thtioxine Voir le message
    D'ou ma question => Comment puis je avoir une instance de A à partir d'une instance de B ?
    Tu ne peux pas, sauf à construire un nouvel objet identique avec new A().

    Mais de toute façon :
    - Non, tu n'en as aucun besoin,
    - je croyais que tu ne pouvais pas modifier la partie du code qui pose problème ?

    Explique-toi.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    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
    Citation Envoyé par thtioxine Voir le message
    Plus loin, dans une partie du code que je ne peux modifier j'ai ceci

    C.class.getDeclaredMethod("setA",new Class[]{A.class}).invoque(_obj,new Object[]{a});

    Hors, l'invocation sous cette forme exige le type exact ce que je n'ai pas (j'ai B)
    Faux, le type, servant à localiser la méthode, tu l'a déjà préciser (A.class), quand au type réel, ce sont les même règles que pour le code "normal", n'importe quel instance de A, ou d'un de ses descendant fait l'affaire

  4. #4
    Membre confirmé

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2007
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2007
    Messages : 89
    Billets dans le blog
    2
    Par défaut
    Pour répondre au dernier post
    non, relis la doc, c indiqué en toute lettre
    Dans le cas d'un appel par invoke,la classe doit etre EXACT et donc pas une dérivée

    Pour le 1er post
    j'ai accés au code (ne serait ce qu'avec un décompilateur) mais je ne peux pas le modifier facilement (je travaille pour une grosse boite qui a des règles trés précises quand aux modifications)

    Mais je vais sans doute m'orienter vers
    try
    {
    .. invoke(..)
    }
    catch(NosumchMetho.)
    {
    .. invoke((A)..)
    ]

    en éspérant que ça fonctionne

    Meric de votre aide

  5. #5
    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
    Citation Envoyé par thtioxine Voir le message
    Pour répondre au dernier post
    non, relis la doc, c indiqué en toute lettre
    Dans le cas d'un appel par invoke,la classe doit etre EXACT et donc pas une dérivée
    J'ai beau la lire et la relire, la javadoc ne dit pas ca, et le code que tu montre marche aussi bien avec un A qu'avec un B extends A. La preuve:

    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
    package test;
     
    public class ReflectionTest {
     
     
    	public static class A {
    		public String toString() {return "Je suis de type réel A";}
    	}
    	public static class B extends A {
    		public String toString() {return "Je suis de type réel B";}
    	}
    	public static class C {
    	    public void setA(A a){
    	    	System.out.println("reçu A: "+a);
    	    }
    	}
    	public static void main(String[] args) throws Exception{
    		Object _obj = new C();
    		A a = new A();
    		B b = new B();
    		A x = new B();
    		Object y = new A();
    		C.class.getDeclaredMethod("setA",new Class[]{A.class}).invoke(_obj,new Object[]{a});
    		C.class.getDeclaredMethod("setA",new Class[]{A.class}).invoke(_obj,new Object[]{b});
    		C.class.getDeclaredMethod("setA",new Class[]{A.class}).invoke(_obj,new Object[]{x});
    		C.class.getDeclaredMethod("setA",new Class[]{A.class}).invoke(_obj,new Object[]{y});
    	}
     
    }
    me donne bien

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    reçu A: Je suis de type réel A
    reçu A: Je suis de type réel B
    reçu A: Je suis de type réel B
    reçu A: Je suis de type réel A

  6. #6
    Membre confirmé

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2007
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2007
    Messages : 89
    Billets dans le blog
    2
    Par défaut
    désolé je dois etre trés fatigué
    tu as bien sur raison
    en fait il n'y as jamais eu de problème
    Simplement, la recherche de la méthode se fait sur la classe B
    (pris dans mon histoire de A et B, j'ai fait un raccourci trop rapide, le code réél étant obj.getClass.getMeth... et c'est le getMethod qui foire)
    En fait il faut simplement utiliser l'autre type de get (celui qui inspecte les methodes de la classe fille et de la classe parente)

    Encore toute mes excuses

    A+

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

Discussions similaires

  1. Caster classe mère et classe fille
    Par zsoufianz dans le forum Général Java
    Réponses: 1
    Dernier message: 02/12/2014, 03h36
  2. Réponses: 12
    Dernier message: 21/05/2014, 14h17
  3. caster un objet vers sa classe mère
    Par harf18 dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 24/03/2010, 10h06
  4. caster une classe mère en classe fille
    Par franchouze dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 01/10/2009, 11h56
  5. Réponses: 6
    Dernier message: 22/11/2008, 15h46

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