NoSuchMethodException取决于执行时间

时间:2017-01-31 08:51:32

标签: java android reflection

我有一个Android应用程序。我正在使用反射来调用CookieManager的方法。

我在做什么:

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%(以后可以使用?)。

1 个答案:

答案 0 :(得分:2)

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

您似乎在调用公共方法。你不需要反思来做到这一点:

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