Java隐藏代码

本文揭示了一个鲜为人知的Java特性——在标识符中使用不可见字符。这些字符不能用作开头,但可以出现在名字的其他部分,导致看似相同的标识符实际上不同。代码示例展示了如何在运行时打印这些隐藏字符,并提到了 u202e这个特殊字符可能会引起显示混乱的问题。
摘要由CSDN通过智能技术生成
不久前,我遇到了字符串中不可见字符的问题。 因为它们是不可见的,所以它们确实会引起混乱。
String a = "Hello\u200e";
    String b = "Hello\u200f";
    System.out.println('\'' + a + "' and '" + b + "' are length "
                     + a.length() + " and " + b.length() 
                     + ", equals() is " + a.equals(b));

版画

'Hello?' and 'Hello?' are length 6 and 6, equals() is false

不可见的标识符

想象一下我对发现您可以在Java:P中的标识符中使用不可见字符的反应。 这些字符不能出现在Java标识符的开头,但可以出现在其他任何位置。

System.out.println("String _\u200e = \"Hello \";");
    System.out.println("String _\u200f = \"World\";");
    System.out.println("String _\u200e\u200f = \" !!\";");
    System.out.println("System.out.println(_\u200e+_\u200f+_\u200e\u200f);");

版画

String _? = "Hello ";
String _? = "World";
String _?? = " !!";
System.out.println(_?+_?+_??);

运行时打印

Hello World !!

因此,我们有三个标识符都显示相同的标识符,因为它们的名称中具有不同的不可见字符!

令人惊讶的是,此代码编译,运行并打印了可能在标识符中但未启动的所有字符。 该代码包含\ u202e ,它确实使代码的显示混乱。

for (char c??h = 0; c??h < Character.MAX_VALUE; c??h++)
        if (Character.isJavaIdentifierPart(c??h) && !Character.isJavaIdentifierStart(c??h))
            System.out.printf("%04x <%s>%n", (int) c??h, "" + c??h);

参考: Vanilla Java博客上来自我们的JCG合作伙伴 Peter Lawrey的隐藏代码


翻译自: https://www.javacodegeeks.com/2012/09/java-hidden-code.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值