0

我遇到了一些奇怪的错误,我想了解会发生什么。

首先,我在 Android 中对片段对象使用反射。为此,我必须捕获反射异常。

此代码有效:

try
{
    return (String) MyFragment.class.getMethod("aStaticMethod", new Class[]{MyActivity.class} ).invoke(null, myActivity);
}
catch(NoSuchMethodException e)
{
    return "fail";
}
catch(IllegalAccessException e)
{
    return "fail";
}
catch(InvocationTargetException e)
{
    return "fail";
}

但由于所有异常都是 ReflectiveOperationException 的子类,所以我可以只创建一个异常处理程序。

此代码有效:

try
{
    return (String) MyFragment.class.getMethod("aStaticMethod", new Class[]{MyActivity.class} ).invoke(null, myActivity);
}
catch(ReflectiveOperationException e)
{
    return "fail";
}

此代码在作为普通 Java 函数的一部分时有效。但是,当我尝试在匿名类中使用它时,事情变得很棘手。

此代码不起作用:

viewPager.setAdapter(new FragmentPagerAdapter(getSupportFragmentManager())
{
    @Override
    public CharSequence getPageTitle(int i)
    {
        try
        {
            return (String) MyFragment.class.getMethod("aStaticMethod", new Class[]{MyActivity.class} ).invoke(null, myActivity);
        }
        catch(ReflectiveOperationException e)
        {
            return "fail";
        }
    }
});

它编译顺利,但是当应用程序到达该行时,我得到了一个 VerifyError。

但是,如果我不使用 ReflectiveOperationException 并诉诸具体类型,事情就会再次起作用!

此代码再次起作用:

viewPager.setAdapter(new FragmentPagerAdapter(getSupportFragmentManager())
{
    @Override
    public CharSequence getPageTitle(int i)
    {
        try
        {
            return (String) MyFragment.class.getMethod("aStaticMethod", new Class[]{MyActivity.class} ).invoke(null, myActivity);
        }
        catch(NoSuchMethodException e)
        {
            return "fail";
        }
        catch(IllegalAccessException e)
        {
            return "fail";
        }
        catch(InvocationTargetException e)
        {
            return "fail";
        }
    }
});

我的问题:发生了什么事?是 Java 或 Android 中的某种错误,还是我在做非法的事情?

4

1 回答 1

0

ReflectiveOperationException在 API 19 (KitKat) 中添加,在 API 19 之前的任何设备上使用它都会导致 a VerifyError,因为该类不存在

于 2015-01-28T17:50:55.663 回答