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 のサブクラスであるため、作成できる例外ハンドラーは 1 つだけです。

このコードは機能します:

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

ReflectiveOperationExceptionAPI 19 (KitKat) で追加されました。API 19 より前のデバイスで使用するとVerifyError、クラスが存在しないため、

于 2015-01-28T17:50:55.663 に答える