首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >反射重载。为反射的varargs方法填充反射数组

反射重载。为反射的varargs方法填充反射数组
EN

Stack Overflow用户
提问于 2011-04-27 10:43:55
回答 1查看 1.6K关注 0票数 2

我正处于有史以来最伟大的杂技竞争者的中间。我需要使用Spring JDBC,而不需要引用它。一个自定义的类加载器提供上下文,我需要使用反射来调用这些方法。一种这样的方法是SimpleJdbcCall.declareParameters(SqlParameter ...)

我的问题是创建和设置varargs SqlParameter (这些实例也必须被反映出来)。我需要将一个参数硬塞到一个数组中,以满足varargs签名。

在下面,为简洁起见,省略了类加载。但是假设是Class<?> simpleJdbcCallClass = SimpleJdbcCall.class,等等。

代码语言:javascript
复制
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);

抛出的异常是:

代码语言:javascript
复制
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 (而不是cast中的SqlParameter )。我怀疑这可能就是问题所在。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-04-27 10:51:33

我认为问题出在这一行:

代码语言:javascript
复制
Object paramArray = Array.newInstance(sqlParameterArrayClass, 1);

具体地说,您没有告诉我们sqlParameterArrayClass是什么,但根据名称,我猜它是数组类型的类。实际上,它需要是数组元素的类;有关newInstance(...)方法,请参阅javadoc。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5798758

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档