先上效果图
可以看到,我们将代码注释掉之后,输出语句依旧执行,代码没有任何问题。
看似没有任何问题的输出语句,却报错,而且提示的错误行数不正确.
这里就涉及到了一个特殊字符:
\u000d
大家可以将这个字符复制到注释后面,观察程序运行效果,发现注释掉的语句仍然可以正常执行!
所以这就有了很多骚操作
我这里先使用一个冒泡排序算法来代替项目中的代码逻辑:
1.我们可以将程序中的一些关键业务代码“注释”掉:
2.我们甚至可以将小括号大括号和关键字“注释”掉:
3.甚至连关键字,变量声明,特定的一些结构我们都可以“注释”掉:
4.类名方法名算什么,统统注释掉:
最后,来一张终极恶搞版:
这时有人说了:
哎呀你这个这么多错误,肯定运行不起来的啦,连上方运行按钮都叉掉了~
令人震惊的是,他确确实实是可以运行的~
这时又有人说:
哎呀这个你肯定是缓存了之前编译好的程序,执行的都是以前的拉~
那我们就在程序中改变几行代码,加几条输出语句
所以我们可以证明,即使程序看起来不像样子,但它真真正正的是可以运行的~
而且我们上述程序中,虽然被我们改的不成样子,但是其实我们并没有破换程序结构,如果破幻,是无法运行的!
我们随便写两句不符合规定的语句:
利用这一点,我们甚至可以将真正的注释破换成不符合规定的语句,混在程序代码中(滑稽):
有些注释,看似是注释,实则…呃~
解释一下原理:
说了这么多,我们这个字符为什么可以有这么大的魔力呢
我们经常可以在程序中看到以下注释:
其实这些注释就是我们所说的unicode编码,是文件保存编码不一致导致的!
而我们的:\u000d也是一个unicode编码,转换后为换行符!
所以…
其实Java在编译过程中是识别这些unicode编码的,并且编译这些unicode编码是会被识别的,即便它存在于注释之中…
所以我们上图中代码看似错误,实则为:
这样就能看明白了吧,代码看似混乱,实则没有一处编译错误,所以程序能正确执行啦!
滑稽:
鲁迅说过:如果程序员想要自己无法被替代,就写一些让别人无法维护的程序~
这个帖子估计会在这一点上帮助你很多~
最后说一句:被打了别找我~