Отражение не полностью реализовано в Android 2.2? - PullRequest
2 голосов
/ 07 ноября 2011

У меня есть код, который отлично работает в 2.3 и выше.Тем не менее, в 2.2 я получаю исключение NullPointerException при присвоении className:

if(field.getType() == java.util.ArrayList.class)
   className = ((ParameterizedType)field.getGenericType()).toString();

EDIT

Я немного покопался в документах для Android и обнаружил, что некоторые изметоды недоступны до уровня API 9. Однако считается, что getType (), getGenericType () и ParameterizedType поддерживаются на уровне API 1. Так почему этот код не работает?

Документы для полей: http://developer.android.com/reference/java/lang/reflect/Field.html

Документы ParameterizedType: http://developer.android.com/reference/java/lang/reflect/ParameterizedType.html

РЕДАКТИРОВАНИЕ

Я обнаружил, что вызов field.getGenericType () не вызывает программуаварийно завершить работу, но молча создает исключение com.sun.jdi.InvocationException.Кажется, что Type, возвращенный из вызова getGenericType (), недействителен?Опять же, это работает на 2.3 и выше, но почему это исключение выдается и ловится на 2.2 и ниже?

1 Ответ

7 голосов
/ 17 ноября 2011

Это известная проблема, вот билет в трекер ошибок Android: Проблема 6636: NPE в org.apache.harmony.luni.lang.reflect.ListOfTypes

Это было исправлено в Android 2.3, но не было перенесено в более ранние выпуски Android, поэтому вы видите сбой в Android 2.2.

Чтобы быть более сложным: если вы запускаете этот код (расширенную версию вашего собственного кода) на Android 2.2:

public class ReproduceBugActivity extends Activity {
  private static final String TAG = "ReproduceBugActivity";
  private ArrayList<Object> mArrayList;

  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    try {
      String className = null;
      Field field = getClass().getDeclaredField("mArrayList");
      if (field.getType() == java.util.ArrayList.class)
        className = ((ParameterizedType)field.getGenericType()).toString();
      Log.i(TAG, "className = " + className);
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

Вы получите это исключение:

java.lang.NullPointerException
   at org.apache.harmony.luni.lang.reflect.ListOfTypes.length(ListOfTypes.java:47)
   at org.apache.harmony.luni.lang.reflect.ImplForType.toString(ImplForType.java:83)
   at com.reproducebug.ReproduceBugActivity.onCreate(ReproduceBugActivity.java:23)

из-за вышеупомянутой ошибки в реализации отражения Java. В Android 2.3 ошибка была исправлена, и вместо этого вы увидите это в logcat:

I/ReproduceBugActivity(23449): className = java.util.ArrayList<java.lang.Object>

Исключение com.sun.jdi.InvocationException, которое вы видите, не имеет к этому никакого отношения, насколько я могу судить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...