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

avec Java Discussion :

Acceder à une methode privé


Sujet :

avec Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Homme Profil pro
    Inscrit en
    Mars 2013
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 53
    Par défaut Acceder à une methode privé
    Bonjour,

    Je suis en stage de premiere année et je voudrais savoir comment utiliser une methode privé d'une classe.

    Je veux utiliser une lib mais je peux pas utiliser la methode.

    Je veux utiliser la methode isApte.

    Bien sur je veux pas utiliser la methode getInstance

    Je peux pas overrider la methode isApte car le constructor est privé.

    Exemple de code de lib:

    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
     
     
    public class Personne{
    private String name;
    private int age;
     
    private Personne(){
    }
     
    public getInstance(){
     return new Personne()
    }
    isApte(){
    if(age >10 & a< 20){
    return true;
    }else{
    return false
    }
    }
     
    }

  2. #2
    Modérateur

    Avatar de Robin56
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juin 2009
    Messages
    5 297
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juin 2009
    Messages : 5 297
    Par défaut
    Citation Envoyé par oliveettom Voir le message
    Je suis en stage de premiere année et je voudrais savoir comment utiliser une methode privé d'une classe.
    Tu ne peux pas, une méthode privée s'utilise au sein de sa classe et c'est tout.

    Je veux utiliser la methode isApte
    Celle-ci n'est pas "private" mais "protected", c'est la valeur par défaut quand on ne met pas de règle de visbilité à la classe. Si tu souhaites l'utiliser il faut que ta classe utilisatrice soit dans le même package ou hérite d'elle-même.
    Responsable Java de Developpez.com (Twitter et Facebook)
    Besoin d'un article/tutoriel/cours sur Java, consulter la page cours
    N'hésitez pas à consulter la FAQ Java et à poser vos questions sur les forums d'entraide Java
    --------
    Architecte Solution
    LinkedIn : https://www.linkedin.com/in/nicolascaudard/

  3. #3
    Membre actif
    Homme Profil pro
    Inscrit en
    Mars 2013
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 53
    Par défaut
    Je te remercie, j'ai vu sur internet c'est possible en faisant de l'introspection.
    L'introspection permet de changer la visibilité des méthodes
    Merci de votre aide pour utilisé l introspection

  4. #4
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 442
    Par défaut
    Si tu veux vraiment la jouer comme ça, tu peux essayer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Method m = objet.getClass().getDeclaredMethod(nom, classArray);
    m.setAccessible(true);
    m.invoke(monObjet,mesParametresArray);
    Mais si tu peux éviter, c'est mieux.

  5. #5
    Membre actif
    Homme Profil pro
    Inscrit en
    Mars 2013
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 53
    Par défaut
    Bonjour,
    Je te remercie pour l aide.
    Lorsque j' execute mon code j'obtiens cette erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    java.lang.NoSuchMethodException: test.Personne.isApte(test.Personne)
    	at java.lang.Class.getMethod(Unknown Source)
    	at relection.Reflection.isValid(Reflection.java:15)
    	at relection.Reflection.main(Reflection.java:41)
    Voici le code de la classe personne
    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
     
    public class Personne {
    	private String name;
     
     
    	private Personne(){
    	}
     
    	public Personne getInstance(){
    	 return new Personne();
    	}
     boolean	isApte(int age){
    	if(age >10 & age< 20){
    	return true;
    	}else{
    	return false;
    	}
     
    	}
     
    }
    Voici ma classe où j utilise la reflection:
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    public class Reflection {
     
    	 public  boolean  isValid(int age) {
    		 Class[] parameterTypes = new Class[] {Personne.class};
    		 boolean result = false;
    		 try {
     
    			Method method = Personne.class.getMethod("isApte", parameterTypes);
     
     
     
    			try {
    				result = (boolean) method.invoke(age, new Object[] {});
    			} catch (IllegalAccessException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			} catch (IllegalArgumentException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			} catch (InvocationTargetException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    		} catch (NoSuchMethodException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (SecurityException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		 return result;
    	 }
     
    	 public static void main(String[] args) {
    		Reflection reflection = new Reflection();
    		reflection.isValid(5);
    	}
    Je vous remercie de votre aide

  6. #6
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 442
    Par défaut
    Il y a 2 erreurs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Method method = Personne.class.getMethod("isApte", parameterTypes);
    parameterType ici est le tableau des Class prises par la méthode isApte. Tu as mis "Personne.class" alors qu'il s'agit de Integer.class

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    method.invoke(age, new Object[] {});
    Il faut invoquer la méthode sur un objet, avec les paramètres souhaités. Pour le moment, method est comme "static" : il n'y a pas de context. Tu dois mettre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    method.invoke(laPersonneQuiSertDeContext, leTableau{5})

  7. #7
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 442
    Par défaut
    Citation Envoyé par Sharcoux Voir le message
    Si tu veux vraiment la jouer comme ça, tu peux essayer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Method m = objet.getClass().getDeclaredMethod(nom, classArray);
    m.setAccessible(true);
    m.invoke(monObjet,mesParametresArray);
    Mais si tu peux éviter, c'est mieux.
    En fait, tout est là depuis le début.

    Pourquoi tu utilises getMethod si je te dis d'utiliser getDeclaredMethod ?
    Comme te le dira la javaDoc, getMethod ne récupère que les méthodes public.

  8. #8
    Membre actif
    Homme Profil pro
    Inscrit en
    Mars 2013
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 53
    Par défaut
    Bonjour,
    Encore merci beaucoup ça fonctionne beaucoup mieux avec le getDeclaredMethod.

    Mais maintenant, j'ai une erreur au niveau de mon invocation.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    java.lang.IllegalArgumentException: object is not an instance of declaring class
    	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    	at java.lang.reflect.Method.invoke(Unknown Source)
    	at relection.Reflection.isValid(Reflection.java:32)
    	at relection.Reflection.main(Reflection.java:49)
    J'ai mis ceci:

    Dans la methode isApte, age est de type int

    La classe personne se trouve dans le package test.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    result = (boolean) method.invoke(test.Personne.class, new Object[] {age});
    J'ai essayé aussi ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    result = (boolean) method.invoke(test.Personne.class, new Integer(age));
    Mais c'est pareil

    Je vous remercie de votre aide

  9. #9
    Membre expérimenté
    Homme Profil pro
    Développeur Java / JEE
    Inscrit en
    Février 2008
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java / JEE

    Informations forums :
    Inscription : Février 2008
    Messages : 185
    Par défaut
    Bonjour

    Citation Envoyé par Robin56 Voir le message
    Celle-ci n'est pas "private" mais "protected".
    En fait, elle n'est même pas "protected" mais "package". La méthode n'est visible que si la classe qui l'appelle est dans le même package et c'est tout.

    http://docs.oracle.com/javase/tutori...sscontrol.html :

    Modifier Class Package Subclass World
    public Y Y Y Y
    protected Y Y Y N
    no modifier Y Y N N
    private Y N N N

    Sinon, pour en revenir au problème, il manque aussi :

    Mathieu

  10. #10
    Modérateur

    Avatar de Robin56
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juin 2009
    Messages
    5 297
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juin 2009
    Messages : 5 297
    Par défaut
    Citation Envoyé par Influenza Voir le message
    En fait, elle n'est même pas "protected" mais "package". La méthode n'est visible que si la classe qui l'appelle est dans le même package et c'est tout.
    Oui en effet je viens de voir la bêtise que je viens de dire..
    Responsable Java de Developpez.com (Twitter et Facebook)
    Besoin d'un article/tutoriel/cours sur Java, consulter la page cours
    N'hésitez pas à consulter la FAQ Java et à poser vos questions sur les forums d'entraide Java
    --------
    Architecte Solution
    LinkedIn : https://www.linkedin.com/in/nicolascaudard/

  11. #11
    Membre actif
    Homme Profil pro
    Inscrit en
    Mars 2013
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 53
    Par défaut
    Personne à une idée????

  12. #12
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 442
    Par défaut
    Essaye int.class alors, mais normalement c'est la même chose.

    Est-ce que tu es sûr que le message d'erreur est toujours exactement le même ?

  13. #13
    Membre actif
    Homme Profil pro
    Inscrit en
    Mars 2013
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 53
    Par défaut
    Bonjour lorsque je mets ce code:
    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
     
    Class[] parameterTypes = new Class[] {Integer.TYPE};
    		 boolean result = false;
     
     
     
    			 Method method = null;
    			try {
    				method = Personne.class.getMethod("isApte",parameterTypes);
    			} catch (NoSuchMethodException e1) {
    				// TODO Auto-generated catch block
    				e1.printStackTrace();
    			} catch (SecurityException e1) {
    				// TODO Auto-generated catch block
    				e1.printStackTrace();
    			}
    J Obtiens le message d erreur suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    java.lang.NoSuchMethodException: test.Personne.isApte(int)
    	at java.lang.Class.getMethod(Unknown Source)
    	at relection.Reflection.isValid(Reflection.java:18)
    	at relection.Reflection.main(Reflection.java:49)
    Exception in thread "main" java.lang.NullPointerException
    	at relection.Reflection.isValid(Reflection.java:28)
    	at relection.Reflection.main(Reflection.java:49)
    J'ai essayé ceci:
    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
     Class[] parameterTypes = new Class[] {int.class};
    		 boolean result = false;
     
     
     
    			 Method method = null;
    			try {
    				method = Personne.class.getMethod("isApte",parameterTypes);
    			} catch (NoSuchMethodException e1) {
    				// TODO Auto-generated catch block
    				e1.printStackTrace();
    			} catch (SecurityException e1) {
    				// TODO Auto-generated catch block
    				e1.printStackTrace();
    			}
    J'obtiens comme message d erreur ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    java.lang.NoSuchMethodException: test.Personne.isApte(int)
    	at java.lang.Class.getMethod(Unknown Source)
    	at relection.Reflection.isValid(Reflection.java:18)
    	at relection.Reflection.main(Reflection.java:49)
    Exception in thread "main" java.lang.NullPointerException
    	at relection.Reflection.isValid(Reflection.java:28)
    	at relection.Reflection.main(Reflection.java:49)
    La methode isApte est la suivant :

    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
     
    package test;
     
    public class Personne {
    	private String name;
     
     
    	private Personne(){
    	}
     
    	public Personne getInstance(){
    	 return new Personne();
    	}
     boolean	isApte(int age){
    	if(age >10 & age< 20){
    	return true;
    	}else{
    	return false;
    	}
     
    	}
     
    }
    Je vous remercie beaucoup pour votre aide

  14. #14
    Membre actif
    Homme Profil pro
    Inscrit en
    Mars 2013
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 53
    Par défaut probleme invoquer une methode
    Bonjour,

    Je souhaite utiliser la reflection mais lorsque j' execute j obtiens cette erreur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    	at sun.reflect.Reflection.ensureMemberAccess(Unknown Source)
    	at java.lang.reflect.Method.invoke(Unknown Source)
    	at reflection.Reflection2.isValid(Reflection2.java:37)
    	at reflection.Reflection2.main(Reflection2.java:60)
    Voici le code de la classe personne:
    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
     
    package test;
    public class Personne{
     
    	private Personne(){
    	}
     
    	public Personne getInstance(){
    		return new Personne();
    	}
    boolean	isApte(int age){
    		if(age >10 & age < 20){
    			return true;
    		}else{
    			return false;
    		}
    	}
     
    }
    Voici le code de la reflection
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
     
    package reflection;
    import java.lang.reflect.Constructor;
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
     
    import test.Personne;
     
    public class Reflection2 {
     
    	 public  boolean  isValid(int age) {
    		 Class[] parameterTypes = new Class[] {Integer.TYPE};
    		 boolean result = false;
    		 Personne newInstance = null;
    		 try {
     
    			Method method = Personne.class.getDeclaredMethod("isApte", parameterTypes);
     
    			Constructor c = Personne.class.getDeclaredConstructor();
    		       c.setAccessible(true); // solution
    		      try {
    				newInstance = (Personne) c.newInstance();
    			} catch (IllegalArgumentException e1) {
    				// TODO Auto-generated catch block
    				e1.printStackTrace();
    			} catch (InstantiationException e1) {
    				// TODO Auto-generated catch block
    				e1.printStackTrace();
    			} catch (IllegalAccessException e1) {
    				// TODO Auto-generated catch block
    				e1.printStackTrace();
    			} catch (InvocationTargetException e1) {
    				// TODO Auto-generated catch block
    				e1.printStackTrace();
    			}
     
    			try {
    				result = (Boolean) method.invoke(newInstance,new Integer(age));
    			} catch (IllegalAccessException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			} catch (IllegalArgumentException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			} catch (InvocationTargetException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    		} catch (NoSuchMethodException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (SecurityException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		 return result;
    	 }
     
    	 public static void main(String[] args) {
    		Reflection2 reflection = new Reflection2();
    		reflection.isValid(5);
    	}
    }
    Je vous rermercie de votre aide

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

Discussions similaires

  1. acceder à une methode d'aprés un button
    Par swilhoss dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 07/06/2008, 19h45
  2. Acceder aux methodes d'une applet
    Par discogarden dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 19/12/2007, 15h45
  3. Réponses: 21
    Dernier message: 22/10/2007, 10h10
  4. [C#]Acceder à une methode d'un objet d'un webservice
    Par Ezekhiel dans le forum Services Web
    Réponses: 1
    Dernier message: 18/12/2006, 23h37
  5. Comment acceder au nom de la fenetre a partir d'une methode?
    Par oOoOuuhmAn dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 13/03/2006, 20h59

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