Java 源码中的 Unicode 逃逸问题,别被注释给骗了

背景

看了一段项目源码,定义了一个 List 对象,但是往该列表对象 add 的代码前面有注释符号,但是程序运行时列表中却存在对象,为什么呢?仔细看了一下,注释符号和 add 代码之间有一个特殊符号 \u000d,这到底是什么东西呢?

奇怪的代码

bash 复制代码
public List<String> getData() {
	List<String> data = new ArrayList<>();
	
	for (int i = 0; i < 10; i++) {
		// 注意,这里有个障眼法是 unicode 的换行符
		// \u000d data.add(i);
	}

	logger.info("data count is {}", data.size());
	return data;
}

运行结果:

基本原理

众所周不知「恕我孤陋寡闻,我没看过这种用法」,Java 编译器编译代码时会解析 unicode 字符,而代码中存在特殊字符的 unicode 符号时,就会产生障眼。

几个主要特殊符号:

  1. \u000a 换行
  2. \u000d 回车
  3. \u007d 左花括号 {
  4. \u007b 右花括号 }

启示录

想起刚入行的时候,看过一本电子书《疯狂的 Java 讲义》,书中介绍了很多 Java 的奇怪玩法,现在大部分都忘记了。

但对单例代码的漏洞,一直记忆犹新。即通过反序列化后创建的类可以打破单例,解决办法是重新序列化方法的 writeObject 保证也是单例。具体细节已经遗忘了,回忆了一下《序列化对单例模式的破坏》。

至于 Unicode 字符逃逸,项目中出现这类迷惑代码,普通开发怎么看得懂呢?尤其是我这种头脑比较简单的人,只会写简单代码,一见到复杂绕绕的代码就懵了哇!

话说回来,unicode 在某种场合还是有用的,比如绕过平台的敏感词检测,之前发布某篇文章通不过的时候,转换成 unicode 编码就过去了。作为程序员交流的暗语也是不错的!

bash 复制代码
\u8001\u733f\u4e0b\u73ed\u4e86
相关推荐
非优秀程序员8 小时前
第04章 邮箱大战,163 与 QQ 的暗战|《互联网产品恩仇录》
java·vue.js·架构
知已难寻8 小时前
Docker 入门:容器技术与 Docker 基础
java·运维·服务器·docker·云原生·容器
文丑颜不良啊10 小时前
LeetCode2481~2500题目解析
java·leetcode
Flynn Liang11 小时前
同一需求三套写法:用 Spring AI、LangChain4j、AgentScope Java 各实现一个带工具调用的 RAG 助手(实战对比)
java·人工智能·大模型·架构设计·spring ai·langchain4j·agentscope
聪明的笨猪猪12 小时前
实际工程问题:AI 生成 Spring Cache(@Cacheable / @CachePut / @CacheEvict)缓存注解踩坑
java·经验分享·面试·ai编程
愿有所息12 小时前
记一次 ARM64 + JDK8 上 fastjson2 的诡异数据错乱
java
秋饼13 小时前
MCP 2026-07-28 无状态协议大改版:Spring AI 2.1 多轮往返请求与网关路由落地
java·ai·技术分享·后端开发
SL_staff14 小时前
JVS-BI 实战:业务人员如何用零代码 ELT + 可视化配置构建实时经营分析闭环
java·spring·全栈
SL_staff14 小时前
企业AI落地难?JVS-AI渐进式实践:安全可控、小切口验证、标准化沉淀与规模化复制
java·开源·aigc
SL_staff16 小时前
JVS数字底座实践:构建企业级统一内容管理平台的技术路径
java·产品