网站首页 > 技术文章 正文
背景
某天,在我的代码里写了如下这么一行注释,让我吃惊是注释里面的代码被执行了。
按常规思路,这行代码被注释了,控制台应该不会有执行结果,但是却出现了如下返回结果。
到这里,我们能大概猜测是 Unicode 解码发生在任何词汇解码之前。而 \u000d 是一个换行符,因此对注释进行了终止导致换行符后面的注释代码被执行了。
什么是 Unicode 逃逸?
我去 oracle 官网查看了一下 Java 语言规范(JLS 3)相关的解释,大意如下:Unicode 转义用于表示仅包含 ASCII 字符的 Unicode 符号。当您需要插入无法在源文件的字符集中表示的字符时,它将派上用场。JLS 3.3节的相关说明,Unicode 转义包含一个反斜杠字符(\),后跟一个或多个'u'字符和四个十六进制数字。
因此,例子中的 \u000d将被视为换行符。
下图为官方 JLS 文档。
这种机制的好处在于它可以在 ASCII 和任何其他编码之间来回切换,并且不需要你弄清楚注释的开始和结束位置!
分析求证
为了证实是不是我们分析的那样,我用了 Java 自带的工具 native2ascii 来将具有任何支持的字符编码的文件转换为具有 ASCII 或 Unicode 转义的文件。
执行如下命令便一目了然了。
我可以发现转换后的代码被换行了!
其实,我也可以通过查看 class 字节码来发现其中的端倪。
看起来跟我们之前分析的一样。
总结
这个骚操作也保证了 Java 核心思想 —— 平台一致性。
虽然这个方式处理机制看似优雅,但是,它却带来了副作用(干扰语义),尤其是在评论中,我们一定要注意!
好了,留个思考题给各位同学,新建一个 Hi.java 文件,将下面的 Unicode 码拷贝到文件,看看执行结果会是什么呢?
来源:https://mp.weixin.qq.com/s/vAyT1HQZSbsIZPHQ2CO3dQ
猜你喜欢
- 2025-07-27 JPA实体类注解,看这篇就全会了(java实体类注解)
- 2025-07-27 Java反射机制最全详解(图文全面总结)
- 2025-07-27 javaEE 新闻管理系统 oracle11+tomcat6
- 2025-07-27 SpringBoot 注解最全详解,建议收藏!
- 2024-10-28 从源码里的一个注释,我追溯到了12年前,有点意思
- 2024-10-28 Oracle数据库下使用PL/SQL编程 oracle数据库中,如何在sqlplus中执行sql脚本
- 2024-10-28 Spring注解驱动之后再说事务啊 spring事物注解失效
- 2024-10-28 让清华毕业大牛带你:深入了解Java中的注解,你能吸收到多少呢?
- 2024-10-28 使用自定义注解和切面AOP实现Java程序增强
- 2024-10-28 sql注入fuzz bypass waf SQL注入对于所有数据库的注入方法是一样的
你 发表评论:
欢迎- 635℃几个Oracle空值处理函数 oracle处理null值的函数
- 627℃Oracle分析函数之Lag和Lead()使用
- 615℃0497-如何将Kerberos的CDH6.1从Oracle JDK 1.8迁移至OpenJDK 1.8
- 610℃Oracle数据库的单、多行函数 oracle执行多个sql语句
- 607℃Oracle 12c PDB迁移(一) oracle迁移到oceanbase
- 601℃【数据统计分析】详解Oracle分组函数之CUBE
- 589℃最佳实践 | 提效 47 倍,制造业生产 Oracle 迁移替换
- 575℃Oracle有哪些常见的函数? oracle中常用的函数
- 最近发表
-
- CVE-2025-30762|Oracle(java oracle)
- 低代码可能铲不掉“屎山”,但能让这个它更有「型」
- 科技大事件:新苹果手表可通过击掌或握手来传递信息
- 你的百万级上下文窗口大模型,可能并没有你想象中那么强
- DApp 开发中的安全测试(软件测试过程中安全测试的具体应用场景和测试思路)
- 盘点Java中最没用的知识⑧:这3个过时套路,你还在代码里硬撑?
- 机房硬件设备及Oracle数据库软件维护服务项目竞争性磋商公告
- 微软与甲骨文扩大合作关系,推出Oracle Database@Azure
- JPA实体类注解,看这篇就全会了(java实体类注解)
- Java反射机制最全详解(图文全面总结)
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端路由 (61)
- 前端数组 (73)
- 前端js面试题 (50)
- 前端定时器 (59)
- 前端获取当前时间 (50)
- Oracle RAC (76)
- oracle恢复 (77)
- oracle 删除表 (52)
- oracle 用户名 (80)
- oracle 工具 (55)
- oracle 内存 (55)
- oracle 导出表 (62)
- oracle约束 (54)
- oracle 中文 (51)
- oracle链接 (54)
- oracle的函数 (58)
- 前端调试 (52)
本文暂时没有评论,来添加一个吧(●'◡'●)