最近遇到一个奇怪的bug,往map中put一个3 在get出来变成了-2。最后发现是因为同事其它模块的代码修改了Integer的缓存对象导致的。
Integer-128到127的对象。
Map中是只能放对象的,如果放一个int类型,jvm会默认装箱,调用Integer的valueOf方法返回Integer对象。因为放的是3所以会从缓存中取对象返回。
同事的代码是声明了一个Integer对象等于3,然后通过反射强行将对象的值改成了-2,所以导致了这个问题
示例代码如下:
Integer test= 3;
Field b = Integer.class.getDeclaredField("value");
b.setAccessible(true);
b.set(test, --test);
System.out.println(Integer.valueOf(3));
打印出来是2