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 :

Instanciation d'une sous-classe


Sujet :

Langage Java

  1. #1
    Membre éclairé
    Avatar de iubito
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2003
    Messages
    389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2003
    Messages : 389
    Points : 655
    Points
    655
    Par défaut Instanciation d'une sous-classe
    Salut
    Je récupère une chaîne de caractères (depuis une DB) de la forme
    et je dois instancier "Classe" et faire un setter avec "blabla".

    Ça marche bien. Mais j'ai un problème quand ma classe est une sous classe, par exemple pack.age.ClasseA$ClasseB.

    Le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Class cl = Class.forName("pack.age.ClasseA$ClasseB");
    Object obj = cl.newInstance();
    jette une java.lang.InstantiationException.

    Celui ci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Class cl = Class.forName("pack.age.ClasseA$ClasseB");
    Constructor construct = cl.getConstructor(new Class[] {});
    construct.setAccessible(true);
    Object obj = construct.newInstance(new Object[] {});
    jette une NoSuchMethodException avec pour message pack.age.ClasseA$ClasseB.<init>

    Si je suis contraint à supprimer toutes mes sous-classes, ça m'embête un peu. Ma sous-classe est public, le constructeur (public lui aussi) n'a aucun paramètre.

    Quelqu'un a-t'il déjà instancié une sous-classe à la volée ? Et comment ?

    Merci d'avance !
    Membre éclairé, lol !

  2. #2
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Est-ce que tes sous-classes sont static ?
    Si ce n'est pas le cas, je ne pense pas qu'il soit possible de les instancier dynamiquement étant donné qu'elles doivent être liés avec une instance de la classe parente...

    a++

  3. #3
    Membre éclairé
    Avatar de iubito
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2003
    Messages
    389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2003
    Messages : 389
    Points : 655
    Points
    655
    Par défaut
    Effectivement elles ne sont pas static.

    Qu'est-ce que cela va impliquer de mettre static une sous-classe ?
    En tout cas en mettant static ça marche tout de suite mieux !

    Membre éclairé, lol !

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 109
    Points : 122
    Points
    122
    Par défaut
    J'ai déjà eu le problème !

    En fait, si tu utilises la réflexion, le constructeur sans argument de la classe interne non static admet... un argument, qui est une instance de la classe externe.
    Par exemple, essaye :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Class cl = Class.forName("pack.age.ClasseA$ClasseB");
    ClasseA a = new ClasseA();
    Constructor construct = cl.getConstructor(new Class[] {ClasseA.class});
    construct.setAccessible(true);
    Object obj = construct.newInstance(new Object[] {a});
    Somme toute, c'est logique, mais ça n'est documenté nulle part (enfin, je n'ai pas trouvé)

  5. #5
    Membre éclairé
    Avatar de iubito
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2003
    Messages
    389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2003
    Messages : 389
    Points : 655
    Points
    655
    Par défaut
    Citation Envoyé par MangeurVasqué
    J'ai déjà eu le problème !

    En fait, si tu utilises la réflexion, le constructeur sans argument de la classe interne non static admet... un argument, qui est une instance de la classe externe.
    Par exemple, essaye :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Class cl = Class.forName("pack.age.ClasseA$ClasseB");
    ClasseA a = new ClasseA();
    Constructor construct = cl.getConstructor(new Class[] {ClasseA.class});
    construct.setAccessible(true);
    Object obj = construct.newInstance(new Object[] {a});
    Somme toute, c'est logique, mais ça n'est documenté nulle part (enfin, je n'ai pas trouvé)
    Aouch ! Faut le trouver ça !

    Je préfère mettre en static (c'est une contrainte pas trop méchante) plutôt qu'utiliser cette méthode, car ça veut dire que je dois parser le nom de la classe, et puis si c'est une sous-classe d'une sous-classe ... d'une classe externe ça va être coton !
    Membre éclairé, lol !

  6. #6
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par iubito
    Qu'est-ce que cela va impliquer de mettre static une sous-classe ?
    En tout cas en mettant static ça marche tout de suite mieux !
    Une sous-classe possède normalement une référence vers une instance de la classe parente :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public class Parent {
     
    	protected String name;
     
     
    	public class SousClasse {
     
    		public String getParentName() {
    			return Parent.this.name;
    		}
    	}
     
    }
    Du coup in ne peut les instancier que depuis une instance de la classe parente...

    On peut eventuellement spécifier l'instance parente à la création, mais ce type d'écriture n'est pas très courant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Parent parent = new Parent();
    SousClasse sousClasse = parent.new SousClasse();
    Dans les deux cas la référence de la classe parente est automatiquement passé à la sous-classe.


    Comme l'indique MangeurVasqué, cela doit être géré en ajoutant un paramètre caché au constructeur... mais il faudrait vérifier cela dans les specs...



    Par contre lorsque tu déclares une sous-classe en static, elle perd ce "lien" avec la classe parente, et correspond donc à une classe "standard" (sauf qu'elle conserve quand même un lien priviligié avec les instances de la classe parente dont elle peut manipuler les champs private).

    a++

  7. #7
    Membre éclairé
    Avatar de iubito
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2003
    Messages
    389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2003
    Messages : 389
    Points : 655
    Points
    655
    Par défaut
    OK merci beaucoup adiGuba !
    Membre éclairé, lol !

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 24/09/2008, 11h18
  2. Réponses: 7
    Dernier message: 20/12/2007, 15h13
  3. Problème avec une sous classe de Graphics2D
    Par Virgile le chat dans le forum 2D
    Réponses: 1
    Dernier message: 16/06/2007, 02h59
  4. Réponses: 1
    Dernier message: 17/11/2006, 16h57

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