2014-09-03 2 views
0

Je reçois un bug étrange et j'aimerais comprendre ce qui se passe. Tout d'abord, j'utilise la réflexion sur les objets fragmentés dans Android. Pour le faire, je dois attraper des exceptions réfléchies.Android VerifyError lors de l'interception d'une exception abstraite dans Java, classe anonyme

CE CODE WORKS:

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"; 
} 

Mais puisque toutes les exceptions sont sous-classes de ReflectiveOperationException, je peux juste faire un gestionnaire d'exception.

CE CODE WORKS:

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

Ce code fonctionne quand il fait partie d'une fonction Java normale. Cependant, les choses deviennent difficiles quand j'essaie de l'utiliser dans une classe anonyme.

CE CODE NE FONCTIONNE PAS:

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"; 
     } 
    } 
}); 

Il compile bien, mais je reçois un VerifyError lorsque l'application atteint cette ligne. Cependant, si je n'utilise pas ReflectiveOperationException et que je recourt à des types concrets, les choses fonctionnent à nouveau!

CE CODE refonctionne:

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"; 
     } 
    } 
}); 

Ma question: ce qui se passe? Est-ce une sorte de bug en Java ou Android ou est-ce que je fais quelque chose d'illégal?

Répondre

0

ReflectiveOperationException a été ajouté dans l'API 19 (KitKat), l'utiliser sur un appareil avant de l'API 19 provoquera une VerifyError parce que la dose de classe n'existe

Questions connexes