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
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
Tu ne peux pas puisqu'il est privé.
Qu'essayes tu defaire au juste ?
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.
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 } }
Certes, mais je me demande si ceci:
qui peut etre lancé lorsque tu executes getDeclaredMethod ne t'empeche pas de faire ce que tu viens d'ecrire !
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
A verifier.
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.
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
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
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager