gpt4 book ai didi

java - 反射过载。为反射可变参数方法填充反射数组

转载 作者:行者123 更新时间:2023-11-30 09:49:26 24 4
gpt4 key购买 nike

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

我的问题是创建和设置可变参数 SqlParameter (也必须反射(reflect)这些实例)。我需要将单个参数硬塞到数组中以满足可变参数签名。

在下文中,为简洁起见省略了类加载。但是假设 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 作为 Actor )。我怀疑这可能是问题所在。

最佳答案

我认为问题出在这一行:

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

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

关于java - 反射过载。为反射可变参数方法填充反射数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5798758/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com