首页 > 代码库 > Java中,如何让System.out.printf("%d", 2 + 2);输出5
Java中,如何让System.out.printf("%d", 2 + 2);输出5
代码如下:
import java.lang.reflect.Field; public class TwoPlusTwo { public static void main(String[] args) throws Exception { Class cache = Integer.class.getDeclaredClasses()[0]; System.out.println(cache.getName()); Field c = cache.getDeclaredField("cache"); c.setAccessible(true); Integer[] array = (Integer[]) c.get(cache); array[132] = array[133]; System.out.printf("%d", 2 + 2); } }
需要利用反射更改Integer中的缓存,具体步骤:
1. 获取Integer中的内部静态类IntegerCache;
2. 获取cache域;
3. c.setAccessible(true)是取消jvm的变量修饰检查,虽然cache数组是static final类型,我们仍然可以修改其数组元素;
4. 获取数组对象;
5. 数组范围默认是-128到127,阅读源码可知,-128到127之间的、并且通过Integer.valueOf得到的Integer值是直接使用缓存的;cache[132]对应的是Integer(4),可将其修改为Integer(5);
6. System.out.printf的函数接口是PrintStream.printf(String format, Object... args),由于入参为Object,2 + 2会被自动装箱,从而输出Integer.valueOf(4) = cache[132] = cache[133] = 5。
Java中,如何让System.out.printf("%d", 2 + 2);输出5
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。