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。

时间: 2024-08-23 07:17:24

Java中,如何让System.out.printf("%d", 2 + 2);输出5的相关文章

Java 中时间处理 System.currentTimeMillis()

import org.testng.annotations.Test;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Date; public class TestDate { @Test public void test01() throws ParseException { Date dt= new Date(); long s=System.currentTimeMilli

java中printf的用法

目前printf支持以下格式:           %c        单个字符           %d        十进制整数           %f        十进制浮点数           %o        八进制数           %s        字符串           %u        无符号十进制数           %x        十六进制数           %%        输出百分号% --------------------------

【04-10】java中的路径

java中的路径 System.getProperty("user.dir")  获取工程的绝对路径 Class.class.getClass().getResource("/").getPath()  类的绝对路径 jsp中的路径 request.getRequestURI() 得到相对地址 request.getRequestURL()  得到地址栏地址 request.getContextPath() 得到工程名 request.getServletPath(

Java 中equals和toString()方法重写

1,equals方法 (1)什么时候需要重写? 如果希望不同内存但相同内容的两个对象equals时返回true,则需要重写equals (2)怎么重写? class A { public int i; pulic A(int i)//构造函数 {this.i=i; } public boolean equals(Object obj)//重写equals {A aa=(A)obj; if(this.i==aa.i) return true; else return flase; } } publ

java中自带时间类用法实例 Date,Timestamp,DateFormat

我们将以Java自带的时间日期类和其中的处理函数进行分析. 一.与时间日期有关的类. java.util.Date.实现类,其对象具有时间.日期组件. java.util.Calendar.抽象类,其对象具有时间.日期组件. java.sql.Date.实现类,其对象具有日期组件. java.sql.Time.实现类,其对象具有时间组件. java.sql.Timestamp.实现类,其对象具有时间日期组件. java.text.DateFormat.抽象类,其对象格式化时间日期. 我们一般会使

java中System.out.print()与System.out.println()与System.out.printf()的差别

System.out.print()与System.out.println()与System.out.printf()的差别 1.System.out.print(): 输出不换行,比如: System.out.print("a"); System.out.print("b"); 结果: ab 2.System.out.println():输出后换行,比如: System.out.println("a"); System.out.println(

浅析Java中print、printf、println的区别

printf主要是继承了C语言的printf的一些特性,可以进行格式化输出print就是一般的标准输出,但是不换行println和print基本没什么差别,就是最后会换行System.out.printf("the number is: d",t); 参照JAVA API的定义如下:'d' 整数 结果被格式化为十进制整数'o' 整数 结果被格式化为八进制整数'x', 'X' 整数 结果被格式化为十六进制整数'e', 'E' 浮点 结果被格式化为用计算机科学记数法表示的十进制数'f' 浮

java中使用printf出错

Eclipse中 Java默认的兼容版本为1.4, 改为1.5及以上版本就行. 项目 ->属性->Javacomplier->complier compliance lever:1.5 System.out.printf("%f",d);//"f"表示格式化输出浮点数.

【转】Java中print、printf、println的区别详解

Java中print.printf.println的区别详解 printf主要是继承了C语言的printf的一些特性,可以进行格式化输出 print就是一般的标准输出,但是不换行 println和print基本没什么差别,就是最后会换行 System.out.printf("the number is: d",t);参照JAVA API的定义如下:'d' 整数 结果被格式化为十进制整数'o' 整数 结果被格式化为八进制整数'x', 'X' 整数 结果被格式化为十六进制整数'e', 'E