2017-01-31 55 views
1

我有一個Android應用程序。我正在使用反射來調用CookieManager的方法。NoSuchMethodException取決於執行時間

我在做什麼:

if (Build.VERSION.SDK_INT >= 21) { 
    Method method; 
    method = CookieManager.class.getClass().getMethod("setAcceptFileSchemeCookies", boolean.class); 
    method.setAccessible(true); 
    method.invoke(null, true); 
} 

基本上這個方法是靜態的。你可以在這裏查看它:https://developer.android.com/reference/android/webkit/CookieManager.html#allowFileSchemeCookies()

所以我可以在任何地方調用它,而無需啓動CookieManager。 (這是連計劃,因爲你只能發起CookieManager之前設置該屬性)

什麼是例外:

java.lang.NoSuchMethodException: setAcceptFileSchemeCookies [boolean] 
at java.lang.Class.getMethod(Class.java:624) 
at java.lang.Class.getMethod(Class.java:603) 
at com.sample.app.CookieClass.setup(CookieClass.java:168) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.sample.app.Application.onCreate(Application.java:111) 
at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1036) 
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4728) 
at android.app.ActivityThread.-wrap1(ActivityThread.java) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1415) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:148) 
at android.app.ActivityThread.main(ActivityThread.java:5443) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 

這是一個問題:

現在來搞笑部分。當我在Application類的onCreate方法中調用它時,它會失敗並出現此異常。但是當我稍後在初始化CookieManager的位置之前調用它時,它就會起作用。這怎麼可能?反思必須到處工作?爲什麼在onCreate中找不到該方法,即使它在那裏是100%(並且稍後會工作?)。

回答

2

CookieManager.class.getClass()中刪除getClass。您正在查找Class類中的方法,而不是CookieManager類中的方法。

您似乎在調用公共方法。你不需要反射來做到這一點:

if (Build.VERSION.SDK_INT >= 21) { 
    CookieManager.setAcceptFileSchemeCookies(true); 
} 
+0

謝謝。有用。反思是必要的,因爲我們並沒有開發Android應用程序本身。所以這是一個使用Android類的Java應用程序。所以我們無法訪問該方法。但是,謝謝!大。我沒有看到這個錯誤:) – Highriser