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

Composants Java Discussion :

Ca marche mais je ne comprend pas pourquoi


Sujet :

Composants Java

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2007
    Messages : 45
    Points : 38
    Points
    38
    Par défaut Ca marche mais je ne comprend pas pourquoi
    Bonjours,

    J'esseyais depuis quelques temps de definir un JPasswordField afin de remplacer mon pathétique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    JTextField myPassword=new JTextField();
    par un plus sophistiqué

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    JPasswordField myPassword=new JPasswordField();
    Mais une fois la password donné, je devais l'utiliser pour fabriquer mon url JDBC. Et la, la méthode myPassword.getPassword() me retournait la version cryptée. Idem si j'utilisais la fonction myPassword.getTExt(), c'etait toujours la version cryptée.

    La solution pour que le password apparaisse cryptée à l'ecran mais fournisse un string en clair avec myPassword.getTExt() passe par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    private JTextField myPassword= new JPasswordField();
    Et là, je ne comprend pas: mypassword est bien un JTextField, donc que le getText() me retourne un String clair, ok.
    Mais pourquoi alors la fonction de crytpage à l'écran fonctionne ? Après tout 'myPassword' est un JTextField.

    Et plus généralement, comment savoir qu'elle seront les future propriété d'une variable d"'un type classe instantiée quand on fait une declaration du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Ancetre myVar = new DerieveAncetre() ;
    Qu'elle seront les fonctionalités de myVar qui seront du type Ancetre ?


    Dans ce cas qui nous occupe, On pourrait dire que pour toutes les fonctions qui sont définie dans JTextField et JPasswordField, ce sont les fonctions de JTextFied qui seront reprise et si une fonction n'est pas definie dans JTextField mais existe dans JPasswordField, alors cette fonctions aussi est dispo.

    Ainsi j'explique pourquoi l'input a l'ecran est crypté.

    Helas, si ce raisonnement etait correct, alors la fonctionalité qui crypte le password, aurait du crypter aussi bien pour le display (ce qu'elle fait) que le getText (ce qu'elle ne fait pas).

    Du coup, je suis un peu perdu et je comprend que je ne comprend pas réellement cette déclaration "JTextField var=new JPasswordField()"

  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,

    Citation Envoyé par murgen23 Voir le message
    Et la, la méthode myPassword.getPassword() me retournait la version cryptée. Idem si j'utilisais la fonction myPassword.getTExt(), c'etait toujours la version cryptée.
    Je ne comprend pas ce que tu veux dire par là, car ni getPassword() ni getText() n'encrypte quoi que ce soit...

    Citation Envoyé par murgen23 Voir le message
    Et là, je ne comprend pas: mypassword est bien un JTextField, donc que le getText() me retourne un String clair, ok.
    Mais pourquoi alors la fonction de crytpage à l'écran fonctionne ? Après tout 'myPassword' est un JTextField.
    Non non et non !
    Le type réel de mypassword est un JPasswordField, et le déclarer dans un type parent ne change en rien ses propriétés !
    C'est ton histoire de cryptage que je ne comprend pas !

    a++

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2007
    Messages : 45
    Points : 38
    Points
    38
    Par défaut
    Voila un example :

    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
     
    JPasswordField myPassword=new JPasswordField();
    .
    .
    System.out.println("getPassword=" +myPassword.getPassword() )  ;     
     
    // string entered 'pirate'
    // output : getPassword=[C@198defc
     
     
     
     private JTextField myPassword = new JPasswordField();
    .
    .
    System.out.println("getText=" + myPassword.getText() )  ;    
     
    // string entered 'pirate'
    // output : getText=pirate
    Note, que contrairement a ce qu'il me semblait, si je declare myPassword du type JPasswordField alors getText() retourne le password en clair mais cette methode est declarée 'deprecated function since JDK1.2'

  4. #4
    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
    Lorsqu'on affiche un tableau, ce n'est pas son contenu mais son "identité" qui est affiché :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.println("getPassword=" + Arrays.toString(myPassword.getPassword()) )  ;
    Il n'y a pas de cryptage !

    Pour getText() c'est déprécié car cela empêche de forcer la suppression du password de la mémoire en écrivant par dessus, ce qu'on ne peut pas faire avec un String :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    	JPasswordField myPassword = new JPasswordField();
    	char[] pass = myPassword.getPassword();
     
    	//  On vérifie le path
    	// ...
     
    	// Puis on l'efface :
    	Arrays.fill(pass, 'x');
    a++

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2007
    Messages : 45
    Points : 38
    Points
    38
    Par défaut
    ok j'ai compris, mauvaise conclusions : getPassword() retourne aussi en clair mais un Arrays.

    Je crois savoir que l'on ecrit

    Ancetre var = new DeriveAncetre() ;

    quand on veut faire de l'overload:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    if (condition) then {
       Ancetre var = new DeriveAncetre1() ;
    } else {
       Ancetre var = new DeriveAncetre2() ;
    }
     
    var.methodeCommune;
    Mais qu'elle est donc la penalité d'écrire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Ancetre var = new DeriveAncetre() ;
     
    // par rapport a
     
    DeriveAncetre var = new DeriveAncetre() ;
    En y reflechissant on pourrait écrire systématiquement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Object var=new DeriveAncetre() ;
    et var est du type DeriveAncetre.

  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
    Car on ne peut appeler une méthode que si elle existe dans le type déclaré !

    C'est le principe de l'abstraction.

    a++

Discussions similaires

  1. Réponses: 4
    Dernier message: 07/01/2008, 23h48
  2. Ma jolie macro fonctionne mais je ne comprends pas pourquoi ^
    Par ouskel'n'or dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 01/07/2007, 06h06
  3. COM : _com_ptr_t ca marche mais je ne comprend pas pourquoi
    Par dockurt2k dans le forum Visual C++
    Réponses: 4
    Dernier message: 21/08/2006, 12h28
  4. Réponses: 2
    Dernier message: 14/01/2006, 20h29
  5. Comprends pas pourquoi ca marche pas
    Par cellimo dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 08/11/2005, 22h10

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