如何实现 System.out.println(“a”) 显示 b

Java23

今天看到一篇文章不用反射,能否交换两个字符串的值. 心想字符串常量在常量池里面,是在就算用了反射也交换不了吧。转念一想,不对,字符串常量虽然本身在常量池里面,但是它依然是个对象,那么 private final 类型的属性仅仅表示它是一个指向常量池的引用,而并非不可修改。完全可以让它指向另一个常量。

分析String的结构

通过反射可以很轻松地获取所有属性

// 获取所有属性
for (Field field : String.class.getDeclaredFields()) {
    System.out.println(field);
}

如何实现 System.out.println(“a”) 显示 b

方框框起来的 private final byte[] java.lang.String.value 即为需要的对象。

设置可见性

接下来就是常见的反射修改可见性。

输入验证码查看隐藏内容

扫描二维码关注本站微信公众号 Johngo学长
或者在微信里搜索 Johngo学长
回复 svip 获取验证码
wechat Johngo学长

相关文章
Halo 开源项目学习(三):注册与登录 Java

Halo 开源项目学习(三):注册与登录

基本介绍 首次启动 Halo 项目时需要安装博客并注册用户信息,当博客安装完成后用户就可以根据注册的信息登录到管理员界面,下面我们分析一下整个过程中代码是如何执行的。 博客安装 项目启动成功后,我们可...
建造者模式 Java

建造者模式

Builder模式:使用多个简单对象逐步构建一个复杂对象,它适用于一些基本组件,但可以有多种组合,这就是所谓的\[En]Builder mode: use multiple simple object...
单例模式只会懒汉饿汉?读完本篇让你面试疯狂加分 Java

单例模式只会懒汉饿汉?读完本篇让你面试疯狂加分

前言 说到设计模式,面试排在第一位的十有八九是单例模式,这一定是大部分人从入门到面试工作都避不开的基础知识。 但单例模式不仅有懒汉模式和饿汉模式两种写法,往往我们掌握的都是最基础的写法,如果你有阅读过...
最大子段和(分而治之) Java

最大子段和(分而治之)

分治法 (O(n\log{n})) 按照"分而治之"的思想,将整个数据区间从中间一分为二,这样我们就将求整个区间的最大子列和转换为求小区间的最大子列和。 设区间左端为left,区间右端为right,区...
Java(2)数据类型与变量 Java

Java(2)数据类型与变量

前言 Java是一种强类型语言。这就意味着必须为每一个变量声明一种类型。在Java中,一共8种基本类型,其中有4种整型、2种浮点型、1种字符串类型char(用于表示Unicode编码的代码单元)和1种...
spring事务传递特性-REQUIRES_NEW和NESTED Java

spring事务传递特性-REQUIRES_NEW和NESTED

spring对于事务的实现的确是它的一大优点,节省了程序员不少时间。 关于交易有很多要谈的,比如实现方法、实现原则、交付特征等。[En]There is a lot to talk about abo...
Netty源码分析之自定义编解码器 Java

Netty源码分析之自定义编解码器

在日常的网络开发当中,协议解析都是必须的工作内容,Netty中虽然内置了基于长度、分隔符的编解码器,但在大部分场景中我们使用的都是自定义协议,所以Netty提供了 MessageToByteEncod...