Я посреди претендента на величайший клудж всех времен. Мне нужно использовать 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
в качестве приведения). Я подозреваю, что это может быть проблемой.