奇妙なバグが発生しました。何が起こるかを理解したいと思います。
まず、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 の何らかのバグですか、それとも違法なことをしていますか?