java中5 2表示,Java中2+2==5解读

先来看一段程序,如下:

package basic;

import java.lang.reflect.Field;

public class TestField {

public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {

@SuppressWarnings("rawtypes")

Class cache = Integer.class.getDeclaredClasses()[0];

Field myCache = cache.getDeclaredField("cache");

myCache.setAccessible(true);

Integer[] newCache = (Integer[]) myCache.get(cache);

newCache[132] = newCache[133];

int a = 2;

int b = a + a;

System.out.printf("%d + %d = %d", a, a, b);

}

}

程序正常运行,输出如下结果:

2 + 2 = 5

分析:

package basic;

/**

* 类TestDeclaredClass.java的实现描述:getDeclaredClasses() 方法返回一个Class对象,包括公共,保护,默认(包)访问的私有类和类中声明的接口的数组,但不包括继承的类和接口。

* 如果类没有声明的类或接口的成员,或者如果此Class对象表示一个基本类型,此方法返回一个长度为0的数组。

*

* @author 2016年6月16日 上午10:17:51

*/

public class TestDeclaredClass {

public static void main(String[] args) {

try {

Class cls = TestDeclaredClass.class;

Class[] clss = cls.getDeclaredClasses();

for (int i = 0; i < clss.length; i++) {

System.out.printf("CLASS = %s \n", clss[i].getName());

}

} catch (SecurityException e) {

e.printStackTrace();

}

}

public class InnerClass1 {

public InnerClass1(){

System.out.println("InnerClass1");

}

}

public interface Inner {

}

public class InnerClass2 {

public InnerClass2(){

System.out.println("InnerClass2");

}

}

private class InnerPrivateClass {

public InnerPrivateClass(){

System.out.println("InnerPrivateClass");

}

}

}

class MyTestDeclaredClass extends TestDeclaredClass {

}

程序正常运行,输出如下结果:

CLASS = basic.TestDeclaredClass$Inner

CLASS = basic.TestDeclaredClass$InnerClass1

CLASS = basic.TestDeclaredClass$InnerClass2

CLASS = basic.TestDeclaredClass$InnerPrivateClass

接着再看:

package basic;

import java.lang.reflect.Field;

/**

* 类TestGetDeclaredField.java的实现描述:getDeclaredField() 方法返回一个Field对象,它反映此Class对象所表示的类或接口的指定已声明字段。

* name参数是一个字符串,指定所需字段的简单名称。

*

* @author 2016年6月16日 上午10:36:21

*/

public class TestGetDeclaredField {

Long size;

public TestGetDeclaredField(Long size){

super();

this.size = size;

}

public static void main(String[] args) {

try {

Class cls = TestGetDeclaredField.class;

Field field = cls.getDeclaredField("size");

System.out.println("Field = " + field.toString());

} catch (Exception e) {

e.printStackTrace();

}

}

}

程序正常运行,输出如下结果:

Field = java.lang.Long basic.TestGetDeclaredField.size

在Java的反射中Field类和Method类的说明:要想使用反射,首先需要获得类对象所对应的Class类的类对象。一个Field对象对应的是一个反射类的属性(成员变量)信息。Field类中定义了一些方法,可以用来查询字段的类型以及设置或读取字段的值。Method类使得我们可以获得方法声明的完整信息。

基于以上信息分析代码如下:

Class cache = Integer.class.getDeclaredClasses()[0];

Field myCache = cache.getDeclaredField("cache");

获取到内部类和内部类中成员变量名为cache的属性信息。

java.lang.Integer$IntegerCache

static final java.lang.Integer[] java.lang.Integer$IntegerCache.cache

我们来看JDK中关于Integer内部类IntegerCache中属性cache的源码如下:

/**

* Cache to support the object identity semantics of autoboxing for values between

* -128 and 127 (inclusive) as required by JLS.

*

* The cache is initialized on first usage. The size of the cache

* may be controlled by the -XX:AutoBoxCacheMax= option.

* During VM initialization, java.lang.Integer.IntegerCache.high property

* may be set and saved in the private system properties in the

* sun.misc.VM class.

*/

private static class IntegerCache {

static final int low = -128;

static final int high;

static final Integer cache[];

static {

// high value may be configured by property

int h = 127;

String integerCacheHighPropValue =

sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");

if (integerCacheHighPropValue != null) {

int i = parseInt(integerCacheHighPropValue);

i = Math.max(i, 127);

// Maximum array size is Integer.MAX_VALUE

h = Math.min(i, Integer.MAX_VALUE - (-low) -1);

}

high = h;

cache = new Integer[(high - low) + 1];

int j = low;

for(int k = 0; k < cache.length; k++)

cache[k] = new Integer(j++);

}

private IntegerCache() {}

}

Java中Integer对-127到128的整形数据是有缓存的,你这里通过反射缓存中的第133号数据(既整数5)赋值给了第132号数据(既整数4),所以4就会变成5来表示。在使用int数据计算时结果是正常的,但是在打印时由于做了装箱,int数据变成了Integer,这时会采用缓存,所以4就会打印出5来。

Java中Websocket使用实例解读

介绍 现在很多网站为了实现即时通讯,所用的技术都是轮询(polling).轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP request,然后由服务器返回最新的数据给客服端的浏览器 ...

java中jdbc源码解读

在jdbc中一个重要的接口类就是java.sql.Driver,其中有一个重要的方法:Connection connect(String url, java.util.Propeties info); ...

全面解读Java中的枚举类型enum的使用

这篇文章主要介绍了Java中的枚举类型enum的使用,开始之前先讲解了枚举的用处,然后还举了枚举在操作数据库时的实例,需要的朋友可以参考下 关于枚举 大多数地方写的枚举都是给一个枚举然后例子就开始sw ...

Java面试-List中的sort详细解读

最近看了一些排序相关的文章,因此比较好奇,Java中的排序是如何做的.本片文章介绍的是JDK1.8,List中的sort方法. 先来看看List中的sort是怎么写的: @SuppressWarnin ...

Java中的泛型 (上) - 基本概念和原理

本节我们主要来介绍泛型的基本概念和原理 后续章节我们会介绍各种容器类,容器类可以说是日常程序开发中天天用到的,没有容器类,难以想象能开发什么真正有用的程序.而容器类是基于泛型的,不理解泛型,我们就难以 ...

Java中Properties类知识的总结

一.Properties类与配置文件 注意:是一个Map集合,该集合中的键值对都是字符串.该集合通常用于对键值对形式的配置文件进行操作. 配置文件:将软件中可变的部分数据可以定义到一个文件中,方便以后 ...

java中的23中设计模式(转)

设计模式(Design Patterns) --可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...

[JavaWeb]关于DBUtils中QueryRunner的一些解读.

前言:[本文属于原创分享文章, 转载请注明出处, 谢谢.]前面已经有文章说了DBUtils的一些特性, 这里再来详细说下QueryRunner的一些内部实现, 写的有错误的地方还恳请大家指出. Que ...

java中的23中设计模式(转载的,有时间一定要熟读)

设计模式(Design Patterns) --可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...

随机推荐

Linux CentOS中使用SQL*Plus启动和关闭数据库

启动和关闭数据库的常用工具有三个 一.SQL*Plus 在SQL*Plus环境中,用户以SYSDBA身份连接到Oracle后,可以通过命令行方式启动或关闭数据库. 二.OEM(企业管理器) 利用OEM ...

强连通 HDU3072

n个点m条边 m条边 权值 简单点说就是求把所有强连通分量连在一起所需的最小花费 不用双向 图是联通的  cost[] 维护到这里的最小花费求和 #include #in ...

Runtime.getRuntime().exec()

Runtime.getRuntime()返回当前应用程序的Runtime对象,该对象 的exec()方法指示Java虚拟机创建一个子进程执行指定的可执行程序,并返回与该子进程对应的Process对象实 ...

maven nexus 3 third party 构件上传

mvn -e deploy:deploy-file -DgroupId=com.oracle -DartifactId=JDBCDriver -Dversion=12.0.1 -Dpackaging= ...

Android设计模式系列-单例模式

单例模式,可以说是GOF的23种设计模式中最简单的一个. 这个模式相对于其他几个模式比较独立,它只负责控制自己的实例化数量单一(而不是考虑为用户产生什么样的实例),很有意思,是一个感觉上很干净的模式, ...

[原]MobileSubstrate 工作流程

[附-腾讯安全管家替换 MobileSubstrate 的流程] com.qq.mqqsecure.deb-postinst--->QSCommand--->QSTempRunner

webpack打包非模块化js

本文主要记录了非模块化js如何使用webpack打包 模块化打包实现方式 webpack是模块打包工具,通过入口文件递归遍历其依赖图谱,绝对是打包神器. bar.js export default f ...

CodeForces - 796C Bank Hacking

思路:共有n-1条边连接n个点,即形成一棵树.一开始需要选择一个点hack--将这个点视为根结点,与它相邻的点防御值加1,与它相隔一个在线点的点的防御也加1.当根节点被hack,即这个点被删除,又变成 ...

Echarts使用Ajax异步获得数据的前端json格式转化问题

利用Ajax获取后台传来的data,官网都有example 但如果后台传来的数据是String格式的,则应该在Ajax的done方法中第一句加上格式转换的语句 data = JSON.parse(da ...

基于Tkinter以及百度翻译爬虫做的一个小的翻译软件

首先看效果: 输入Hello, 可见输出 int. 打招呼 下面看源码: from tkinter import * import requests# 首先导入用到的库 request = reque ...

你可能感兴趣的:(java中5,2表示)