Прежде всего позвольте мне сказать, что я поддерживаю плохо разработанный код другого человека, поэтому я ограничен тем, насколько могу его изменить.Отражение Java, где параметр метода является интерфейсом
Теперь, что происходит, это то, что они создали серию методов, которые вызываются отражением. Один из этих методов берет карту как один из ее аргументов. Во время выполнения эта карта реализована с помощью Hashtable.
Вот проблема: я получаю исключение NoSuchMethodException, потому что он ищет метод с Hashtable в качестве аргумента, даже если Hashtable реализует интерфейс Map. Меня смущает то, что если я не буду использовать отражение (основное изменение дизайна в этом случае) и передал Hashtable, он будет ссылаться на метод с параметром Map - так почему же он не работает одинаково, когда я использую отражение ?
Учитывая, что я в значительной степени должен придерживаться рефлексии, есть ли способ получить метод с аргументом Map для вызова, когда я передаю ему класс, реализующий этот интерфейс?
Если вы хотите, я могу издеваться код до демонстрации ...
Проблема существует около 20 методов называемых methodXyz с различными аргументами, которые работают очень хорошо. Только этот новый принимает карту как аргумент, вызывающий проблемы. Я могу сделать то, что вы говорите, но это требует, чтобы я определил, является ли данный параметр Картой с использованием, например, instanceof :) Я не понимаю, почему отражение не работает так же, как не отраженный код, когда поиск методов?!?! Он должен использовать совершенно другой механизм, я думаю ... – BigMac66
getMethod() ожидает точных типов определения.Вот почему он называется getMethod(), а не findMethod(). Вы можете написать свой собственный метод findMethod(), если вы часто отправляете динамический метод. Это предполагает поиск методов, имеющих имя proprer, фильтрацию того, где параметры не совместимы с данными аргументами, и касается случаев, когда более одного метода остается кандидатом, например. следующий случай является неоднозначным и является ошибкой компиляции: new StringBuffer(). append (null). – gawi