Метод отображается в getDeclaredMethods (), но не может быть найден с помощью getDeclaredMethod (), почему? - PullRequest
3 голосов
/ 27 июля 2011

Я пытаюсь использовать фрагмент:

GenericModel.class.getDeclaredMethod("findById");

, чтобы получить метод с именем "findById".Я знаю, что метод существует, потому что когда я вызываю:

GenericModel.class.getDeclaredMethods();

, метод указывается в возвращаемом массиве.

Однако при использовании первого фрагмента я получаю файл java.lang..NoSuchMethodException?Почему?

Ответы [ 4 ]

4 голосов
/ 27 июля 2011

Предположительно findById фактически принимает параметры. Но вы ищете метод с таким именем, который не имеет ни одного. Скорее всего, что вы хотите:

GenericModel.class.getDeclaredMethod("findById", new Class[] { int.class });

Это будет соответствовать методу с такой подписью:

Object findById(int id) { ... }
2 голосов
/ 27 июля 2011

Судя по названию, findById принимает аргументы.Однако вы не передаете ничего. Вам нужно указать аргументы findById в качестве дополнительных параметров для вызова getDeclaredMethod, чтобы он знал, какой метод вам дать - может быть десять различных findById.

2 голосов
/ 27 июля 2011

getDeclaredMethod() также принимает типы параметров, и вы не указали его, а в случае findViewById это метод, который получает int в качестве параметра.

0 голосов
/ 03 декабря 2018

В моем проекте есть несколько ClassLoaders.

Классы аргументов метода одинаковы, но ClassLoaders (или экземпляры ClassLoaders), которые загружают эти классы, различны.

Например, ClassA имеет метод methodA с аргументом argumentA, набранный com.example.A, загруженный загрузчиком классов ClassLoaderA.

Однако в вашем Java CLASSPATH у вас есть com.example.Aзагружается загрузчиком классов ClassLoaderB.Когда вы вызываете ClassA.class.getDeclaredMethod("methodA", new Class[] { A.class });, он все равно не сможет найти метод. Поскольку com.example.A, загруженный ClassLoaderA, не совпадает с com.example.A, загруженным ClassLoaderB.

Может использоваться модель родительского делегирования / шаблон синглтона для пользовательских загрузчиков классов.чтобы решить проблему.

Я знаю, что это не связано с этим делом, но это одна из возможных причин, по которой метод отображается в getDeclaredMethods (), но не может быть найден с помощью getDeclaredMethod () .

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