Соответствующие массивы классов - PullRequest
2 голосов
/ 27 мая 2010

Я пишу подпрограмму для вызова методов, найденных по имени и массиву значений параметров класса

Сопоставление метода с помощью getName работает, но при попытке сопоставить данный класс [] для параметров и Method.getParameterTypes () у меня возникают проблемы.

Я предполагал, что это будет работать:

<code>
Class[] searchParams = new Class[] { float.class, String.class };
Class[] methodParams = m.getParameterTypes();</p>

<p>if(methodParams == searchParams) {
 m.invoke(this, paramValues);
}

Но, очевидно, нет - m.invoke никогда не достигается. Я проверил, и methodParams предоставляет те же классы, что и searchParams.

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

<code>
Class[] searchParams = new Class[] { float.class, String.class };
Class[] methodParams = m.getParameterTypes();</p>

<p>boolean isMatch = true;
for(int i = 0; i < searchParams.length; i++) {
 if(!searchParams.getClass().equals(methodParams.getClass())) {
  isMatch = false;
 }
}</p>

<p>if(isMatch) {
 m.invoke(this, paramValues);
}

Ответы [ 2 ]

5 голосов
/ 27 мая 2010

Массивы - это объекты, а не примитивы. Использование == для объектов сравнивает только в том случае, если они оба указывают на одну и ту же ссылку , тогда как на самом деле вы хотите сравнить каждый отдельный элемент массива отдельно.

Вы хотите использовать для этого Arrays#equals().

if (Arrays.equals(methodParams, searchParams)) {
    // ...
}
1 голос
/ 27 мая 2010

Ваш первый метод на самом деле не сравнивает элементы массива, а сравнивает ссылки на массивы, которые не будут одинаковыми. Если вы считаете, что второй фрагмент кода некрасив, вы можете взглянуть на Arrays.equals (Object [] a, Object [] a2) , который фактически сравнивает два массива попарно (точно что вы делаете во втором случае).

...