我遇到了一些奇怪的错误,我想了解会发生什么。
首先,我在 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 中的某种错误,还是我在做非法的事情?