Отражение Java: массив классов против массива типов параметров - PullRequest
1 голос
/ 03 июня 2009

У меня есть объект m класса Method. Я вызвал m.getParameterTypes() для создания массива params параметров метода.

У меня также есть массив arr объектов. Я хотел проверить, относятся ли объекты в arr к тем же типам, что и типы в params (и в том же порядке).

Что я сделал, так это создал массив классов, который включает класс каждого объекта в обр Затем я попытался сравнить классы с параметрами. Оказывается, они никогда не могут быть равными, потому что классы в массиве классов имеют формат java.lang.String, а параметры в массиве параметров имеют формат String. Как я могу сравнить массивы? Как я могу изменить формат одного из них?

Ответы [ 3 ]

7 голосов
/ 03 июня 2009

getParameterTypes() возвращает Class<?>[], тогда как сами аргументы будут объектами (поэтому у вас будет Object[]). Чтобы проверить правильность аргументов, вы можете использовать:

if (parameterTypes.length != arr.length) {
  // Invalid: wrong number of arguments
}

for (int i=0; i < parameterTypes.length; i++) {
  if (arr[i] == null && parameterTypes[i].isPrimitive()) {
    // Invalid: can't pass null for a primitive parameter
  } else if (arr[i] != null && !parameterTypes[i].isInstance(arr[i])) {
     // Invalid: invalid argument type
  } else {
     // Valid
  }
}

(Конечно, делайте все, что вам нужно для действительных / недействительных случаев.)

1 голос
/ 05 ноября 2009

Вместо того, чтобы проверять, совместимы ли параметры метода с вашим массивом объектов, почему бы не позволить Class.getMethod() сделать это за вас? Я имею в виду, почему бы не сделать что-то вроде этого:

Class[] classes = new Class[myArr.length];
for (int i=0; i<myArr.length; i++) {
    classes[i] = myArr[i].getClass();
}

Method m = YouMethodsClass.class.getMethod("methodName", classes);

Разве это не сработает для вас?

0 голосов
/ 03 июня 2009

Если вы проводите такое сравнение, вы должны использовать полностью определенное имя (тип 'java.lang.String'), чтобы убедиться, что совпадение действительно правильное (поскольку два класса могут иметь одинаковое "простое" имя и быть из разные пакеты).

Можете ли вы предоставить код, который вы использовали, чтобы мы могли подсказать вам, что нужно изменить, чтобы получить полные имена?

Метод getParameterTypes () возвращает класс [], поэтому каждый элемент является классом. Вы можете вызвать getCanonicalName () (или getName () в некоторых случаях, см. Javadoc для класса), чтобы получить полностью определенное имя.

Для массива объектов вы можете вызвать object.getClass (). GetCanonicalName (), чтобы получить эквивалент.

РЕДАКТИРОВАТЬ: Ответ Джона Скита - лучший подход, когда вы вообще не сравниваете имена, а вместо этого используете метод Class isInstance (), чтобы проверить совместимость этого класса.

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