加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

带有IntegerCache的Java valueOf(int)为valueOf返回值3(1)

发布时间:2020-12-15 02:13:18 所属栏目:Java 来源:网络整理
导读:我面临IntegerCache的问题: 使用iBatis数据访问框架,内部使用iBatis PreparedStatement类. 调用数据库程序就好 { call UPDATE_PROC(?,?,?) }with params : [123,234,345,TEST1,567,TEST2] 而iBatis API设置第一个参数使用: typeHandler.setParameter(ps,i
我面临IntegerCache的问题:
使用iBatis数据访问框架,内部使用iBatis PreparedStatement类.

调用数据库程序就好

{ call UPDATE_PROC(?,?,?)  }
with params : [123,234,345,TEST1,567,TEST2]

而iBatis API设置第一个参数使用:

typeHandler.setParameter(ps,i + 1,value,mapping.getJdbcTypeName());

i=0,value=123

这里ps是对PreparedStatement的引用,i是数据库过程中的参数索引.

它在内部打电话

ps.setInt(i,((Integer) parameter).intValue());

i=1,parameter=123 (Note : i is int not Integer)

在内部使用Java反射api调用此调用:

public Object invoke(Object proxy,Method method,Object[] params) throws Throwable

method : setInt,params : [1,123]

在获取方法调用的i的Integer值时,JVM调用以下方法:

public static Integer valueOf(int i) {
    assert IntegerCache.high >= 127;
    if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}

IntegerCache.low = -128
IntegerCache.high = 127

IntegerCache.cache [i(-??IntegerCache.low)]的值以IntegerCache.cache [129]结束,整数缓存索引[129]应该有值1,但是当我调试代码时,我在索引处找到值3 [129] ]:

,-8,-7,-6,-5,-4,-3,-2,-1,3 **index[129]**,2,3 **index[131]**,4,5,6,7,8,9,10,11

因为IntegerCache是??最终类型,所以不应该有重复的值,例如3指数[129]和[131]

所以,我最终有例外:

java.sql.SQLException: Missing IN or OUT parameter at index:: 1

我的问题是如何做到这一点?
请建议

解决方法

my question is how this can be possible?

某些代码可能通过反射更改缓存实例的Integer.value字段.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读