反思超载。为反射的varargs方法填充反射数组

时间:2011-04-27 02:43:55

标签: java reflection

我正处于争夺有史以来最大冲突的竞争者之中。我需要使用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)进行投射。无论是否进行此转换,都会引发异常。

调试我可以确认paramArraySqlParameter[]sqlParameterClass.cast(sqlOutParameter)SqlOutParamter(不是SqlParameter投放)。我怀疑这可能是问题所在。

1 个答案:

答案 0 :(得分:2)

我认为问题出在这一行:

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

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