Java 代理对象调用引发参数类型不匹配

Java 代理对象调用引发参数类型不匹配,java,kotlin,generics,mybatis,dynamic-proxy,Java,Kotlin,Generics,Mybatis,Dynamic Proxy,我使用代理调用另一个代理失败。始终引发参数类型不匹配异常。有人能帮忙吗 这是代码 // 1, use mybatis sqlSessionFactory create a Proxy object for MapperProxy. @Suppress("UNCHECKED_CAST") private fun <T> createMapper(sqlSessionFactory: SqlSessionFactory, clazz: Class<T>):

我使用代理调用另一个代理失败。始终引发参数类型不匹配异常。有人能帮忙吗

这是代码

// 1, use mybatis sqlSessionFactory create a Proxy object for MapperProxy.
@Suppress("UNCHECKED_CAST")
private fun <T> createMapper(sqlSessionFactory: SqlSessionFactory, clazz: Class<T>): T {
    return Proxy.newProxyInstance(
        clazz.classLoader,
        arrayOf(clazz),
        KtMapperProxy(
            sqlSessionFactory.configuration.getMapper(
                clazz,
                sqlSessionFactory.openSession()
            )
        )
    ) as T
}

// 2, this class is the Proxy class.
class KtMapperProxy<T>(private val mapper: T) : InvocationHandler {
    override fun invoke(proxy: Any, method: Method, args: Array<Any?>?): Any {
        return method.invoke(mapper, args)
    }
}

// 3, here is the UserMapper class method be called.
fun getById(@Param("id") id: Long): User

// 4, this is test.
@Test
fun `test mapper query`() {
    val userMapper = DataSourceHelper.getMapper(sqlSessionFactory, UserMapper::class.java)
    assertEquals(userMapper.getById(1L).username, "user_1")
}
//1,使用mybatis sqlSessionFactory为MapperProxy创建代理对象。
@抑制(“未选中的_CAST”)
私有fun createMapper(sqlSessionFactory:sqlSessionFactory,clazz:Class):T{
返回Proxy.newProxyInstance(
clazz.classLoader,
排列(克拉兹),
KtMapperProxy(
sqlSessionFactory.configuration.getMapper(
克拉兹,
sqlSessionFactory.openSession()
)
)
)as T
}
//2,这个类是代理类。
类KtMapperProxy(私有val映射器:T):调用处理程序{
覆盖有趣的调用(代理:Any、方法:method、args:Array?):Any{
return method.invoke(映射器,args)
}
}
//3,下面是要调用的UserMapper类方法。
fun getById(@Param(“id”)id:Long):用户
//这是一个测试。
@试验
fun`test mapper query`(){
val userMapper=DataSourceHelper.getMapper(sqlSessionFactory,userMapper::class.java)
assertEquals(userMapper.getById(1L).username,“user\u 1”)
}

我发现了问题所在。我应该在使用vararg参数调用方法时扩展args。因此,应该是method.invoke(映射器,*args),而不是method.invoke(映射器,args)