Pourquoi une méthode avec un paramètre booléen pas être trouvé par la réflexion?
Je suis en train de jouer autour avec un peu de réflexion appels pour appeler une méthode qui est normalement caché de moi.
Je sais que ce n'est pas un bon comportement, mais comme je l'ai dit im jouant autour.
J'ai utilisé ce code pour récupérer et invoquer la méthode:
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
setData = ConnectivityManager.class.getDeclaredMethod("setMobileDataEnabled", Boolean.class);
setData.setAccessible(true);
setData.invoke(cm, false);
Cela me donne cette Exception:
03-02 12:21:40.411: ERROR/test(1052): java.lang.NoSuchMethodException: setMobileDataEnabled
03-02 12:21:40.411: ERROR/test(1052): at java.lang.ClassCache.findMethodByName(ClassCache.java:308)
03-02 12:21:40.411: ERROR/test(1052): at java.lang.Class.getDeclaredMethod(Class.java:748)
Puis j'ai essayé de voir si la méthode est déclarée dans la classe et essayé de trouver toutes les méthodes et invoquer la méthode:
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
Method[] methods = cm.getClass().getMethods();
for (Method method : methods) {
Log.d(Test.class.getSimpleName(), "Method name is: " + method.getName());
if (method.getName().equals("setMobileDataEnabled")) {
Log.d(Test.class.getSimpleName(), "Found method calling");
method.setAccessible(true);
method.invoke(cm, false);
}
}
Cela me donne la sortie suivante:
03-02 12:19:41.851: DEBUG/Test(980): Method name is: getActiveNetworkInfo
03-02 12:19:41.851: DEBUG/Test(980): Method name is: getAllNetworkInfo
03-02 12:19:41.851: DEBUG/Test(980): Method name is: getBackgroundDataSetting
03-02 12:19:41.851: DEBUG/Test(980): Method name is: getLastTetherError
03-02 12:19:41.861: DEBUG/Test(980): Method name is: getMobileDataEnabled
03-02 12:19:41.861: DEBUG/Test(980): Method name is: getNetworkInfo
03-02 12:19:41.861: DEBUG/Test(980): Method name is: getNetworkPreference
03-02 12:19:41.861: DEBUG/Test(980): Method name is: getTetherableIfaces
03-02 12:19:41.861: DEBUG/Test(980): Method name is: getTetherableUsbRegexs
03-02 12:19:41.861: DEBUG/Test(980): Method name is: getTetherableWifiRegexs
03-02 12:19:41.861: DEBUG/Test(980): Method name is: getTetheredIfaces
03-02 12:19:41.871: DEBUG/Test(980): Method name is: getTetheringErroredIfaces
03-02 12:19:41.871: DEBUG/Test(980): Method name is: isTetheringSupported
03-02 12:19:41.871: DEBUG/Test(980): Method name is: requestRouteToHost
03-02 12:19:41.871: DEBUG/Test(980): Method name is: setBackgroundDataSetting
03-02 12:19:41.871: DEBUG/Test(980): Method name is: setMobileDataEnabled
03-02 12:19:41.871: DEBUG/Test(980): Found method calling
03-02 12:19:41.871: DEBUG/ConnectivityService(127): setMobileDataEnabled(false)
03-02 12:19:41.891: DEBUG/ConnectivityService(127): getMobileDataEnabled returning true
03-02 12:19:41.931: ERROR/Test(980): InvocationTargetException
03-02 12:19:41.931: ERROR/Test(980): java.lang.reflect.InvocationTargetException
03-02 12:19:41.931: ERROR/Test(980): at android.net.ConnectivityManager.setMobileDataEnabled(ConnectivityManager.java:379)
03-02 12:19:41.931: ERROR/Test(980): at java.lang.reflect.Method.invokeNative(Native Method)
03-02 12:19:41.931: ERROR/Test(980): at java.lang.reflect.Method.invoke(Method.java:521)
03-02 12:19:41.931: ERROR/Test(980): at Test(Test.java:84)
Cette sortie m'indique que le Method
est là et je peux appeler cela malgré le fait que l'Android test de cohérence des coups de pied dans et interdit à l'appel de la plus profonde du système de méthodes.
Pourquoi est-ce que la méthode n'est pas trouvé par getDeclaredMethod
?
InvocationTargetException
enveloppe le "réel" d'exception, vous avez besoin de nous montrer l'ensemble de la trace de la pile.La trace de la pile n'est pas pertinent, il ne montre que la méthode est trouvé et l'a appelé
U ne essayer de passer boolean.class au lieu de Boolean.class
Je suis en désaccord. Mais qui vous conviennent.
Je reçois InvocationTargetException sur 2.2.1 en raison de SecurityException de non-autorisation accordée WRITE_SECURE_SETTINGS
OriginalL'auteur Janusz | 2011-03-02
Vous devez vous connecter pour publier un commentaire.
Deux causes possibles de ce problème, ne peut pas dire qui, sans être une knowning de la source:
Boolean
et pasboolean
? Différents types, potentiellement différentes méthodes surchargées, qui est pourquoi les littéraux commeboolean.class
existent et doivent être utilisés ici.getDeclaredMethod()
ne regarde que la classe de ses propres méthodes, pas ceux qui ont été héritées. Vous aurez à parcourir la hiérarchie de classe pour obtenir les méthodes héritées.OriginalL'auteur Michael Borgwardt
À la Question titre, vous écrivez
boolean
(en minuscules), mais dans votre code, vous recherchezBoolean
(en majuscules). À essayer si le paramètre type estboolean
(primitive):OriginalL'auteur Sean Patrick Floyd
Est
setMobileDataEnabled
sur ConnectivityManager ou un parent de la classe? En regardant getDeclaredMethod, je pense qu'elle doit être sur la classe elle-même, tandis que getMethod obtient des méthodes à partir de l'ensemble de l'arbre d'héritage.OriginalL'auteur Melv
Mettre le bon utilise des autorisations dans le AndroidManifest.xml
Le problème que vous rencontrez est un problème de sécurité.
OriginalL'auteur Android