我是有史以来最伟大的组合的竞争者。我需要使用Spring JDBC而不需要引用它。自定义类加载器提供上下文,我需要使用反射来调用方法。其中一个方法是SimpleJdbcCall.declareParameters(SqlParameter…)
我的问题是创建和设置变量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
作为cast)。我怀疑这可能是问题所在。
我认为问题出在这一行:
Object paramArray = Array.newInstance(sqlParameterArrayClass, 1);
具体来说,您没有告诉我们sqlParameterArrayClass
是什么,但根据名称,我猜这是数组类型的类。实际上,它需要是数组元素的类;有关newInstance(...)
方法,请参阅javadoc。