Я попытался использовать отражение, чтобы использовать настраиваемое представление списка для приложения с целевым уровнем API 7. Необходимые поля доступны только с уровня API 9, поэтому я попытался исправить это с помощью отражения.
Мне нужно найти защищенный метод View.overScrollBy (int, int, int, int, int, int, int, int, boolean).Когда я вызываю
View.getDeclaredMethods()
и перебираю массив Method [], я нахожу его, но когда я пытаюсь
View.class.getDeclaredMethod(String name, Class...< ? > paramTypes)
, я получаю NoSuchMethodException.Я сравнил жестко закодированные значения метода Name и parameterType со значениями, извлеченными из метода (найденными с помощью итерации), и они идентичны ...
private boolean initCompatibility()
{
Method[] methods = View.class.getDeclaredMethods();
try {
// The name of the Method i am looking for;
String OVERSCROLL_S = "overScrollBy";
for (Method meth : methods) {
if (meth.getName().equals(OVERSCROLL_S)) {
mListView_overScrollBy = meth;
break;
// method found
}
}
// Params for getDeclaredMethod(…)
String methodName = "overScrollBy";
Class[] methodParams = { Integer.TYPE, Integer.TYPE, Integer.TYPE,
Integer.TYPE, Integer.TYPE, Integer.TYPE, Integer.TYPE,
Integer.TYPE, Boolean.TYPE };
// works
Method test = View.class.getDeclaredMethod(methodName,methodParams);
// fails
View.class.getDeclaredMethod(mListView_overScrollBy.getName(),
mListView_overScrollBy.getParameterTypes());
/*
* I also tried this way around and again the first worked and the second
* failed, so the input arguments are not the problem...
* View.class.getDeclaredMethod( mListView_overScrollBy.getName(),
* mListView_overScrollBy.getParameterTypes() );
* Method test = View.class.getDeclaredMethod(methodName,methodParams);
*/
return true;
} catch (SecurityException e) {
e.printStackTrace();
return false;
} catch (NoSuchMethodException e) {
e.printStackTrace();
return false;
}
}
Я не понимаю, почему вызов всегда работает в первый рази не во второй раз.Интересно, что также происходит сбой, когда я вызываю только один раз для View.class.getDeclaredMethod (String name, Class ... <?> ParamTypes) и не имеет значения, использую ли я жестко закодированные входные значения или значение, извлеченное из методаЯ ищу ...
Кто-нибудь знает, в чем проблема?Спасибо