Недавно я наблюдал большое количество сбоев в приложении, которое я поддерживаю при использовании предварительного просмотра разработчика Android P.
Погружаясь (глубоко) в код проекта, я нашел метод проблемыследующее:
public static <T> T get(MatrixCursor cursor, int column) {
try {
cursor.moveToFirst();
Method get = MatrixCursor.class.getDeclaredMethod("get", int.class);
get.setAccessible(true);
return (T) get.invoke(cursor, column);
} catch (Exception e) {
throw new IllegalArgumentException("Android has changed the implementation of MatrixCursor?!");
}
}
Насколько я понимаю, этот код используется для непосредственного извлечения пользовательского объекта из MatrixCursor, а не примитивного типа, байтового массива или строки.Ранее был закрытый метод внутри MatrixCursor
, который выполняет это внутренне, и к этому методу мы обращаемся через отражение.
Излишне говорить, что с этим связан ряд проблем.подход.Насколько мне известно, рефлексия для доступа к частным API - это функция, которую Android советует против .Тем не менее, до предварительного просмотра Android P, это, похоже, работало как ожидалось.
Это заставляет меня задавать следующие вопросы:
Изменилась ли реализация MatrixCursor
или полностью отраженаустарел как Android P?
К сожалению, я не на 100% понимаю, какие у меня есть альтернативы, чтобы избежать этой проблемы.Любые предложения для этого очень ценятся, есть ли курсор, который можно использовать для хранения пользовательских объектов?