Соответствие типа параметра отражения Java, инструкции по обработке интерфейсов вместо классов - PullRequest
3 голосов
/ 03 апреля 2011

Учитывая класс Something с конструктором public Something(List<String> l), я хотел бы использовать klass.getConstructor(parameterTypes), где parameterTypes[0] - это класс java.util.ArrayList (потому что мне нужно "сопоставить" данный конкретный экземпляр), а не интерфейс Java..util.List.

Это не работает (NoSuchMethodException), потому что для Java Reflection требуется соответствие класса EXACT.Как лучше обойти это?

Ответы [ 2 ]

7 голосов
/ 03 апреля 2011

Может быть излишним, и по общему признанию может забрать слишком много конструкторов:

Constructor[] constructors = klass.getConstructors();
for(Constructor constructor:constructors) {
      Class<?>[] params = constructor.getParameterTypes();
      if(params.length == 1 && params[0].isAssignableFrom(ArrayList.class) {
          //Yep could be the one you want.
      }
}
0 голосов
/ 03 апреля 2011

Отражение только найдет методы, которые фактически объявлены.Если объявлено, что конструктор принимает List, это единственный конструктор.Там нет такого понятия, как «сопоставление конкретного экземпляра» при использовании отражения.Если бы у вас было двух конструкторов, один из которых брал List, а другой - ArrayList, то вы могли бы получить любой из них через getConstructor.

Я не понимаю, почему вы думаете, что вынужно это.Если вы вызываете newInstance, а затем используете getConstructor для объявленного типа List, вы можете передать ему экземпляр ArrayList.

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