Yhzhtk / note

知识代码笔记
https://github.com/Yhzhtk/note/issues
MIT License
108 stars 11 forks source link

如何实现 2 + 2 = 5 (Java版) #14

Open Yhzhtk opened 10 years ago

Yhzhtk commented 10 years ago
public static void main(String[] args) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException {
    Class cache = Integer.class.getDeclaredClasses ()[0];
    Field c = cache.getDeclaredField ("cache");
    c.setAccessible (true);
    Integer[] array = (Integer[]) c.get (cache);
    array[132] = array[133];
    System.out.println(2 + 2);
    System.out.printf("%d",2 + 2);
}

原理分析:array[132] = 4, array[133] = 5

直接相加就是本身的计算,2 + 2 = 4。

而printf的计算是通过缓存的array来计算的,2 + 2 = 4,而 4 对应 %d的结果是array[132],而array[132]被替换成了array[133],即5,从而达到改变结果。