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

  1. #21
    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 de ton aide.

    Si je fais comme ça c'est qu'il a bien une raison.

    Ma lib est un exemple, je ne peux pas la touchée normalement. La lib de la classe personne est un exemple.

    Je veux utilisée cette méthode et pas utilisé ton pattern bridge.

    Je vous rermercie de votre aide

  2. #22
    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 oliveettom Voir le message

    Je veux utilisée cette méthode
    Le code que je t'ai donné le fait.
    Citation Envoyé par oliveettom Voir le message
    et pas utilisé ton pattern bridge.
    Libre à toi, mais dans le cas présent, je ne vois aucune raison d'aller utiliser l'introspection qui prend plus de lignes, est plus lent, n'apporte aucun contrôle à la compilation et ne marche pas dans un SecurityContext, alors qu'en 3 lignes on y arrive en respectant les règles du langage.

  3. #23
    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.

    Le constructor est privé

    Je vous remercie de votre aide

  4. #24
    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

  5. #25
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    result = (boolean) method.invoke(test.Personne.class, new Object[] {age});
    Pas bon, c'est ton instance de personne que tu dois passer, pas sa déclaration de classe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Personne p = ......;
    result = (boolean) method.invoke(p, new Object[] {age});

  6. #26
    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 de ton aide.

    Pourtant, je lui passe bien son instance dans mon code au niveau de l invocation, à moins de faire une erreur.

    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
     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();
    			}

  7. #27
    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,

    Ton erreur est explicite, tu ne peux pas invoquer une méthode sur un objet qui n'est pas instancié.

    A la place de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     result = (boolean) method.invoke(test.Personne.class, new Object[] {age});
    Il te faudrait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     result = (boolean) method.invoke(Personne.getInstance(),10);
    Au lieu du Personne.getInstance(), j'imagine que dans la pratique tu reçois déjà une instance de ton objet "Personne" qu'il te faudrait utiliser.

    Mathieu

    Edit : Oups j'avais pas vu les réponses de la page 2

  8. #28
    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,
    J'ai invoquer un object instancier.
    newInstance est un object personne, je m'en sert lors de l invoke comme le montre le code ci-dessous.
    L'erreur proviens au niveau de l invoke
    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
    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();
    			}

  9. #29
    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
    A la fois un Personne.getInstance() aurait fait l'affaire aussi plutôt que d'invoquer le constructeur privé...

  10. #30
    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
    Je viens de faire un test avec 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
    17
    18
    19
    20
    public class Reflection {
     
    	public boolean isValid(int age) {
    		boolean result = false;
    		try {
    			Method m = Personne.class.getDeclaredMethod("isApte", Integer.TYPE);
    			m.setAccessible(true);
    			result= (boolean) m.invoke(Personne.getInstance(), age);
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    		return result;
    	}
     
    	public static void main(String[] args) {
    		Reflection reflection = new Reflection();
    		System.out.println(reflection.isValid(5)); 
    		System.out.println(reflection.isValid(15)); 
    	}
    }
    Ce qui ressort bien :
    false
    true

    Par contre la méthode getIntance() de Personne n'a aucun sens si elle n'est pas déclarée "static"...

    Mathieu

  11. #31
    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 beaucoup.

    Tu as résolu mon problème

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

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