Отражение перегрузки. Заполнение отраженного массива для метода отраженных переменных - PullRequest
2 голосов
/ 27 апреля 2011

Я посреди претендента на величайший клудж всех времен. Мне нужно использовать Spring JDBC, даже не ссылаясь на него. Пользовательский загрузчик классов предоставляет контекст, и мне нужно использовать отражение для вызова методов. Одним из таких методов является SimpleJdbcCall.declareParameters (SqlParameter ...)

Моя проблема с созданием и настройкой varargs SqlParameter (эти случаи также должны быть отражены). Мне нужно ввести один параметр в массив для удовлетворения сигнатуры varargs.

Далее для краткости загрузка классов опущена. Но предположим Class<?> simpleJdbcCallClass = SimpleJdbcCall.class и т. Д.

Constructor sqlOutParameterConstructor =
    sqlOutParameterClass.getConstructor(String.class, int.class);
Object sqlOutParameter = sqlOutParameterConstructor.newInstance(param, type);

Object paramArray = Array.newInstance(sqlParameterArrayClass, 1);
Array.set(paramArray, 0, sqlParameterClass.cast(sqlOutParameter));
// IllegalArgumentException thrown above.
// It is thrown without the call to .cast too.

Method declareParametersMethod = 
    simpleJdbcCallClass.getMethod("declareParameters", sqlParameterArrayClass);
declareParametersMethod.invoke(procedure, paramArray);

Исключение:

java.lang.IllegalArgumentException: array element type mismatch
at java.lang.reflect.Array.set(Native Method)

Метод занимает SqlParameter ..., и у меня есть экземпляр подкласса SqlOutParameter. Поэтому я пытаюсь разыграть с sqlParameterClass.cast(sqlOutParameter). Исключение выдается с или без этого приведения.

Отладка Я могу подтвердить, что paramArray является SqlParameter[], а sqlParameterClass.cast(sqlOutParameter) является SqlOutParamter (не SqlParameter в качестве приведения). Я подозреваю, что это может быть проблемой.

1 Ответ

2 голосов
/ 27 апреля 2011

Я думаю, что проблема в этой строке:

Object paramArray = Array.newInstance(sqlParameterArrayClass, 1);

В частности, вы не говорите нам, что такое sqlParameterArrayClass, но основываясь на названии, которое я предполагаю, это класс типа массива. Фактически, это должен быть класс элемента массива; см. javadoc для newInstance(...) методов.

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