先看下这段神奇的Java代码:
public static void main(String[] args) throws Exception {
doSomethingMagic();
System.out.printf("2 + 2 = %d", 2 + 2);
}
执行结果:2 + 2 = 5
那么doSomethingMagic到底做了什么神奇的事情呢?先看代码:
private static void doSomethingMagic() throws Exception {
Class cache = Integer.class.getDeclaredClasses()[0];
Field c = cache.getDeclaredField("cache");
c.setAccessible(true);
Integer[] array = (Integer[]) c.get(cache);
array[132] = array[133];
}
所以这个例子其实包含了Java中整型类型Integer的一个知识点。
可能有的朋友对于doSomethingMagic里面的代码有点摸不着头脑,让我们先查看上图第17行 2 + 2反编译出来的代码:
编辑器将2+ 2的值先计算出来,等于4。最后System.out.println打印出来的值,实际上是Integer.valueOf(4)的返回值。
那么我们就查看JDK里Integer.valueOf的实现:
上面的实现代码,从830行到832行,逻辑非常清楚:如果valueOf的参数i在IntegerCache.low和IntegerCache.high之间,即[-128, 127]的闭区间,则直接从IntegerCache这个缓存区域里返回。只有当输入参数i不在[-128,127]区间内,才执行代码832,基于输入参数i创建一个新的Integer实例。
带着这个理念,我们再看doSomethingMagic就清楚多了。这个方法通过Java反射将上图IntegerCache的成员cache设置成可访问:setAccessible(true), 然后将IntegerCache的第132个元素的值用第133个元素的值覆盖。
我们从Eclipse调试器里发现,Integer cache里第132个元素的值为4,第133个元素的值为5。本来Integer.valueOf方法,对于输入4,从Integer cache里返回第132个元素的值,即4。现在这个元素的值被第133个元素即5覆盖了,所以最后得到了 2 + 2 = 5。
用一句话概括这个场景: 2 + 2 = 4 = Integer.valueOf(4) = 5 ( 因为4在Integer cache里对应的记录已经被我们的代码显式替换成了5)。
要获取更多Jerry的原创技术文章,请关注公众号"汪子熙"或者扫描下面二维码:
相关推荐
- 整型:Java提供了四种整数类型,包括byte(1字节,-128到127),short(2字节,-32,768到32,767),int(4字节,-2^31到2^31-1),以及long(8字节,-2^63到2^63-1)。这些类型用于存储无符号整数。 - 浮点型:...
对于初学者而言,理解Java的基础语法和核心概念至关重要,这不仅能够为后续的学习奠定坚实的基础,还能帮助开发者更好地理解和利用Java的强大功能。 2. **环境设置** - **步骤1:下载JDK** 访问Oracle官网或...
### 水仙花数Java程序实现 #### 知识点概述 本篇文章将深入探讨如何使用Java编程语言实现寻找“水仙花数”的过程。...同时,通过对给定代码的深入理解与优化建议,可以帮助读者更好地掌握相关技术要点。
以上知识点覆盖了 Java 应用开发的基础语法部分,包括编译与运行命令、文件格式、跨平台性、类与文件命名规则、关键字与标识符、注释、数据类型与运算符等方面,为初学者提供了全面且深入的理解。
接口在Java中扮演着契约的角色,可以理解为包含抽象方法的抽象类,一个类可以实现多个接口。例如: ```java interface MyInterface { void myMethod(); } class MyClass implements MyInterface { public ...
在本课程“S1-使用Java语言理解程序逻辑-第二章变量、数据类型和运算符”中,我们将深入探讨Java编程的基础,特别是关注变量、数据类型以及运算符的使用。这些概念构成了任何程序的核心,是编写有效代码的基础。通过...
首先,让我们深入了解一下Java中的数据类型。Java的数据类型分为两大类:基本数据类型和引用数据类型。 1. 基本数据类型: - 整型:byte(1字节,-128到127),short(2字节,-32,768到32,767),int(4字节,-2,...
对于初学者来说,理解并掌握 Java 的基本数据类型和变量的声明至关重要。本文将深入探讨 Java 中的数据类型以及如何声明变量。 Java 提供了八种基本数据类型,它们分为两大类:整型和浮点型,以及两种布尔类型和一...
这个实验是Java入门阶段的重要实践,通过它,学习者可以深入理解面向对象编程的基本概念,并熟悉Java的输入输出操作。同时,这也是一个很好的起点,为进一步学习文件操作、数据库连接、GUI编程等复杂话题打下基础。
5. **Java的基本数据类型**: - 逻辑型:boolean,用于表示真或假。 - 字符型:char,用于存储单个字符。 - 整型:byte、short、int、long,分别用于存储不同范围的整数值。 - 浮点型:float、double,用于存储...
在本教程中,我们将深入探讨Java编程语言中的数字求和运算。...它是学习和理解Java编程语言的重要起点。在后续的学习中,您可以在此基础上探索更复杂的算法和数据结构,逐渐成为一名熟练的Java开发者。
《Java完美经典》是江义华撰写的一本深入学习Java编程的著作,它结合了大量的代码示例,旨在帮助读者深入理解和掌握Java编程语言的核心概念和技术。这本书覆盖了超过100个程序范例,涵盖了从基础语法到高级特性的全...
1. **基本语法**:Java的声明语句、变量、常量的使用,包括不同数据类型(如整型、浮点型、字符型、布尔型)的声明和赋值。 2. **控制结构**:包括条件语句(if-else,switch-case)和循环结构(for,while,do-...
通过深入学习2-标识符号、关键字、类型(上)和3-标识符号、关键字、类型(下)的文件内容,你可以进一步了解这些概念的实际应用,包括变量的声明、赋值、类型转换,以及如何避免关键字冲突等问题。这将有助于你编写更...
在Java编程语言中,数组是一种基础且重要的数据结构,用于存储同类型的元素序列。当我们需要将两个或多个数组合并成一个大的数组时,就需要用到数组的合并技术。本篇文章将详细探讨Java中如何实现数组的合并。 首先...
Java提供了多种内置的数据类型来满足不同的需求,包括整型(如`byte`、`short`、`int`、`long`)、浮点型(如`float`、`double`)、字符型(`char`)以及布尔型(`boolean`)。这些数据类型是构建复杂应用程序的基础...
2. **数据类型与变量**:包括基本数据类型(整型、浮点型、字符型、布尔型)和引用数据类型,以及声明、初始化和使用变量的方法。 3. **控制结构**:涵盖条件语句(if、if-else、switch)、循环(for、while、do-...
这个"java程序设计大学教程试题+课件"集合为学生和学习者提供了丰富的学习资源,包括试题和课件,旨在帮助他们深入理解Java编程语言的基础概念、语法以及应用。 Java是一种面向对象的编程语言,由Sun Microsystems...
### 变量的使用 #### 一、变量与常量的概念及使用 在Java编程语言中,**变量**是用于存储数据的一种基本单位。通过变量,我们可以存储各种类型的值,并在程序...掌握这些基础知识对于后续深入学习Java编程至关重要。
Java 程序设计课件第三章 类与对象的深入理解 Java 程序设计课件第三章 类与对象的深入理解主要介绍了 Java 中的类和对象的概念,包括对象的创建和使用、数组、static 关键字、this 关键字、包、import、package、...