Warum kann eine Methode mit einem boolean-parameter nicht gefunden werden, per reflection?
Ich bin Herumspielen mit einigen Reflexion ruft eine Methode aufrufen, die normalerweise vor mir versteckt.
Ich weiß, dass dies kein gutes Verhalten, aber wie gesagt, ich Spiele herum.
Habe ich dieses code abzurufen, und die Methode aufrufen:
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
setData = ConnectivityManager.class.getDeclaredMethod("setMobileDataEnabled", Boolean.class);
setData.setAccessible(true);
setData.invoke(cm, false);
Dieser gibt mir diese Ausnahme:
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)
Dann habe ich versucht, um zu sehen, ob die Methode ist in der Klasse deklariert und versucht, diese zu finden, alle Methoden und ruft die gewünschte Methode:
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);
}
}
Dieser gibt mir folgende Ausgabe:
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)
Diese Ausgabe zeigt mir, dass die Method
ist da und ich können es nennen, trotz der Tatsache, dass die Android-sanity-check-in tritt und verbietet die Berufung der tieferen system-Methoden.
Warum ist es, dass die Methode nicht gefunden, über getDeclaredMethod
?
InvocationTargetException
umschließt die "echte" Ausnahme, die Sie brauchen, um uns zu zeigen, der ganze stack-trace.Der stack-trace, ist irrelevant, zeigt es nur, dass die Methode gefunden und aufgerufen
Hat u versuchen vorbei boolean.class statt Boolean.class
Ich bin nicht einverstanden. Aber sich anzupassen.
Ich bekomme InvocationTargetException auf 2.2.1 weil der SecurityException nicht die Berechtigung erteilt WRITE_SECURE_SETTINGS
InformationsquelleAutor Janusz | 2011-03-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zwei mögliche Ursachen für dieses problem, kann nicht sagen, welche bekannt werden, ohne die Quelle:
Boolean
und nichtboolean
? Verschiedene Arten, die potentiell verschiedene überladene Methoden, weshalb Literale wieboolean.class
vorhanden und müssen hier eingesetzt werden.getDeclaredMethod()
sieht nur die Klasse seine eigenen Methoden, nicht diejenigen, die vererbt worden. Sie haben zum Durchlaufen der Hierarchie der Klasse zu bekommen geerbten Methoden.InformationsquelleAutor Michael Borgwardt
In dem Frage-Titel, Sie schreiben
boolean
(Kleinschreibung), aber in Ihrem code, Sie suchen fürBoolean
(upper case). Versuchen Sie dies, wenn der parameter Typ istboolean
(primitive):InformationsquelleAutor Sean Patrick Floyd
Ist
setMobileDataEnabled
auf ConnectivityManager oder einer übergeordneten Klasse? Blick auf getDeclaredMethod, ich denke, es muss auf die Klasse selbst, in der Erwägung, dass getMethod ruft Methoden aus dem gesamten vererbungsbaums.InformationsquelleAutor Melv
Setzen Sie die richtigen Berechtigungen verwendet in der AndroidManifest.xml
Das problem, das Sie haben, ist eine Frage der Sicherheit.
InformationsquelleAutor Android