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 :

appel d'un private setter


Sujet :

Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    428
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 428
    Points : 60
    Points
    60
    Par défaut appel d'un private setter
    Bonjour;

    J'ai récupéré un code avec une classe qui implémente un setter "private" !
    Comme appeller ce setter à partir d'une autre classe ?

    Merci

  2. #2
    Membre expérimenté Avatar de willoi
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    1 355
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 355
    Points : 1 639
    Points
    1 639
    Par défaut
    Tu ne peux pas puisqu'il est privé.

    Qu'essayes tu defaire au juste ?

  3. #3
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Citation Envoyé par yanis97 Voir le message
    Bonjour;

    J'ai récupéré un code avec une classe qui implémente un setter "private" !
    Comme appeller ce setter à partir d'une autre classe ?

    Merci
    Non, de par la définition même du concept de private.

    [Grillé de loin]

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    428
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 428
    Points : 60
    Points
    60
    Par défaut
    Citation Envoyé par sinok Voir le message
    Non, de par la définition même du concept de private.

    [Grillé de loin]
    Re;

    Ds certains bean exemples avec hibernate, un bean est défini comm suit :

    public class Event {
    private Long id;
    .....
    // getter/setter
    private void setId(Long id) {
    this.id = id;
    }

    Comment vous expliquer ceci ?

  5. #5
    Membre expérimenté Avatar de willoi
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    1 355
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 355
    Points : 1 639
    Points
    1 639
    Par défaut
    Parce que l'identifiant est defini en interne ou alors par un constructeur.

    Ce qui empeche de modifier l'identifiant lors d'un update. On s'assure ainsi que l'identifiant reste attaché à l'objet sur lequel on travaille.

  6. #6
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Désolé de briser un rêve, mais c'est possible
    La preuve en image pour les plus sceptiques :

    D'abord, la classe qui pourrait vous sembler inaccessible :

    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 Essai
    {
        private int maValeur;
     
        public Essai()
        {
        	maValeur = 0;
        }
     
        private void setValeur( int t )
        {
        	maValeur = t;
        }
    }

    Et voici le code qui permet de récupérer les champs private et d'invoquer les méthode private

    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
     
    import java.lang.reflect.Field;
    import java.lang.reflect.Method;
     
    public class Introspection
    {
        public static void main( String[] arg ) throws Exception
        {
        	Essai e = new Essai();
     
        	Field champs = e.getClass().getDeclaredField( "maValeur" );
        	champs.setAccessible( true );
        	Method method = e.getClass().getDeclaredMethod( "setValeur", int.class );
       	method.setAccessible( true );
     
       	System.out.println( champs.getInt( e ) ); //affiche 0
        	method.invoke( e, 4 );
       	System.out.println( champs.getInt( e ) ); //affiche 4
        }
    }

  7. #7
    Membre expérimenté Avatar de willoi
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    1 355
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 355
    Points : 1 639
    Points
    1 639
    Par défaut
    Certes, mais je me demande si ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        SecurityException - If a security manager, s, is present and any of the following conditions is met:
     
            * invocation of s.checkMemberAccess(this, Member.DECLARED) denies access to the declared method
            * the caller's class loader is not the same as or an ancestor of the class loader for the current class and invocation of s.checkPackageAccess() denies access to the package of this class
    qui peut etre lancé lorsque tu executes getDeclaredMethod ne t'empeche pas de faire ce que tu viens d'ecrire !
    A verifier.

  8. #8
    Membre expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Points : 3 083
    Points
    3 083
    Par défaut
    La proposition de dinobogan est techniquement juste.
    Maintenant ce n'est pas parce qu'on peut le faire qu'on DOIT le faire ! C'est trop crade de faire ça.
    Il faut modifier le framework, ou alors créer un autre objet intermédiaire contenant un autre ID et overridant par exemple getId afin de renvoyer le tient et non l'autre.
    Mais c'est crade crade quoi Modifier un ID perso j'ai jamais eu besoin, il doit y avoir un problème de design.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    428
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 428
    Points : 60
    Points
    60
    Par défaut
    Citation Envoyé par willoi Voir le message
    Parce que l'identifiant est defini en interne ou alors par un constructeur.

    Ce qui empeche de modifier l'identifiant lors d'un update. On s'assure ainsi que l'identifiant reste attaché à l'objet sur lequel on travaille.
    OK j'ai bien compris mais j'ai récupéré une application dont une classe utilise cette conception et je dois apporter certaines évolutions qui nécessite la modif de l'attribut protégé et l'appel du setter (private).
    Je ne peux pas modifier le setter en le rendant public car je risque d'avoir des regressions (effet de bord). Ma question comment je résoudre ce pb ?

    Merci

  10. #10
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Citation Envoyé par willoi Voir le message
    Certes, mais je me demande si ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        SecurityException - If a security manager, s, is present and any of the following conditions is met:
     
            * invocation of s.checkMemberAccess(this, Member.DECLARED) denies access to the declared method
            * the caller's class loader is not the same as or an ancestor of the class loader for the current class and invocation of s.checkPackageAccess() denies access to the package of this class
    qui peut etre lancé lorsque tu executes getDeclaredMethod ne t'empeche pas de faire ce que tu viens d'ecrire !
    A verifier.
    On peut effectivement empêcher l'invocation d'une méthode privée. Mais je n'ai pas réussi à différencier les méthodes privées des méthodes public. On ne peut pas interdire l'accès de private sans interdire l'accès de public.
    un complément de réponse ici http://lists.apple.com/archives/Java.../msg00350.html

    Par contre, je suis entièrement d'accord sur le côté absolument crado de cette technique. La méthode private est uniquement pour le fonctionnement interne d'un objet.
    Malheureusement, ne vivant pas dans un monde informatique parfait, yanis97 n'a pas vraiment le choix : c'est soit l'introspection, soit la décompilation-recompilation, soit le contact avec le concepteur de l'API pour qu'il modifie son code

Discussions similaires

  1. Réponses: 0
    Dernier message: 10/02/2010, 19h55
  2. Réponses: 5
    Dernier message: 10/08/2009, 11h17
  3. [AC-2007] Appeler une Private Sub "AfterUpdate"
    Par jpg75014 dans le forum VBA Access
    Réponses: 9
    Dernier message: 04/04/2009, 08h48
  4. [E-03]Appeler Private SUB (question de base)
    Par lafafmentvotre dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 19/10/2008, 19h07
  5. [Bean] Automatiser les appels de setters / getters
    Par shinchun dans le forum API standards et tierces
    Réponses: 3
    Dernier message: 27/12/2004, 15h18

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