有感于 Java 中的 Integer,来一个题目。

2018-07-20 11:15:12 +08:00
 hugedata
有感于这个帖子:/t/472515
来一个鬼畜版,先猜一猜程序输出结果,然后跑一把验证下看看:
public static void main(String[] args) {
try
{
fuck();
}
catch (NoSuchFieldException e)
{
e.printStackTrace();
}
catch (IllegalAccessException e)
{
e.printStackTrace();
}

for (Integer i = 1; i < 4; i++) {
System.out.println(i);
}
}

private static void fuck() throws NoSuchFieldException, IllegalAccessException {
Integer x = 100;
Class c = Integer.class.getDeclaredClasses()[0];
Field f = c.getDeclaredField("cache");
f.setAccessible(true);
Integer[] cache = (Integer[]) f.get(x);
cache[130] = cache[131];
}
2874 次点击
所在节点    程序员
8 条回复
blindpirate
2018-07-20 11:25:16 +08:00
老梗了,奇技淫巧
specita
2018-07-20 12:24:13 +08:00
我理解的是,integer 做++操作的时候,如果在 cache 范围内,只是把数组下标加 1 咯...
promise2mm
2018-07-20 12:50:31 +08:00
看了一下 Integer 的 valueOf 源码:
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}

--> 伪代码:
if i in[-128, 127]
return cache[i + 128];
return new Integer(i);

现在把 cache[130] -> cache[131];
即当 for 循环到 2 的时候, 调用 valueOf(2) == 3
直接跳过了 2.
feiyuanqiu
2018-07-20 13:03:02 +08:00
原理楼上都说了,就说个题外话,知乎的轮子哥真是带坏了好多人 demo 代码的命名
hugedata
2018-07-20 13:34:01 +08:00
@feiyuanqiu 知乎的轮子哥是谁?
seancheer
2018-07-20 14:20:17 +08:00
@hugedata 指的是你那种 fuck,shit 之类的方法,变量命名方式。。。这个人在知乎回答某些编程问题时经常这么干。
alamaya
2018-07-20 14:58:34 +08:00
你这一堆反射正常人不用翻源码都看出来有坑
98jiang
2018-07-20 19:50:25 +08:00
就是把 2 换成 3 了吧

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/472594

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX