大家好。我没有更新Hydra。她正忙着在家照顾孩子。
(相关资料图)
几天前,我碰巧赶上了小组中的代码审查。下午下来后,我觉得血压很高。我不禁感叹,要使代码标准化还有很长的路要走
今天,让我们总结一下Java中的一系列代码死亡提示。通过这些技能,您可以编写同事无法理解的代码~
至于我为什么要写同事们不懂的代码,我发现通过这门课程仍然有很多优点。让我举几个例子:
同事无法轻松修改您的代码以避免不适当的团队合作和引入bug
建立个人不可替代的能力,以避免解雇风险
在代码审查期间帮助同事治疗多年低血压
好吧,让我们停止那些严肃的胡说八道。别胡说八道了。我们现在就开始吧。无用的知识会再次增加
我敢打赌你从没想过有人会把钱下毒。看看下面的代码,它就像方法中的一行注释一样简单。
猜猜这个程序做了什么。执行后,将在控制台上打印:
当你看到这个时,你看起来很困惑吗 为什么要在注释中执行代码
事实上,这一原则存在于熟悉的代码中。上面是一个转义字符,表示换行符。Java中的编译器不仅编译代码,还解析代码并将其替换为相应的字符。因此,在解析了上述代码之后,它实际上是这样的:
通过这种方式,我们可以解释为什么可以执行注释中的语句。当然,如果您认为上面的代码不够强大,并且希望足够强大,那么可以编写以下代码。
将打印执行结果。类似地,以下代码的转义表示。
至于用这种方式写作的好处,当然,它被用在一些不想让别人理解的地方。据估计,每个人都读过下面的笑话。
如果你写这篇文章,如果客户知道一些代码,他在阅读后会得到帮助。但是,如果您按照以下方式编写,大多数人会认为这是一段乱码:
恕我直言,如果没有几十年的技巧,我看不出这里的处决是完美的。
要编写其他人无法理解的代码,一项非常重要的技能是将简单的事情复杂化。例如,当判断类型号的正负时,可以写如下:
但我不想使用简单的代码。我只是玩游戏,必须写以下内容:
那又怎样,这是否迫使我立刻站起来!当其他人看到这一点时,他们必须思考它说了什么。
事实上,原则很简单。此处使用无符号右移操作。举个简单的例子。例如,它在移位之前转换为补码:
无符号右移的形式如下,该数字采用十进制。
因此,当一类数字向右移动31位而没有符号时,实际上,前31位的高位都是0,其余的低位是原始符号位。因此,它可以用来判断数字的正负。
基于这些知识,我们可以做很多工作。例如,如果未正确使用0,我们可以按如下方式定义0:
从以上知识中,我相信你可以很容易地理解,在一个数字不带符号右移32位后,二进制的所有位都是0,所以你最终会得到0。所以问题是,为什么我不使用它并立即将32位右移
这是因为当移动类型号时,将对运算符右侧的参数执行模32余数。因此,如果您直接写32,您将什么也不做,只会得到原始值。
在古代,赵高指出鹿是马,但现在院子里的农民颠倒了真假。阻止同事阅读您的代码的强大武器之一是让他们失去基本的判断能力,并在遇到条件判断时陷入迷雾。他们不知道下一步该选择哪个分支。
正如我所说,您可以打印以下代码。没人会相信的
是的,只要你理解布尔类型,你就会知道这是不合逻辑的。但是,在完成以下转换后,您可以将其变为现实。
首先,在类中找到一个隐藏位置并插入以下代码:
然后运行上面的程序,你会发现它神奇地打印出来。
事实上,原则很简单。首先,通过反射获取类中定义的变量:
然后使用反射,移除其修改器,最后将其值设置为。在稍后使用变量定义类型的过程中,将执行自动装箱,并将调用以下方法:
在这一点上,是的,但它是,所以它不满足第一个表达式,最终将返回。
通过这种方式,您可以解释上述打印结果,但请记住,在编写此文件时,您必须在代码中找到一个隐藏的角落,以避免被发现,否则您将很容易被击败
下一项技术有点强大。您可以将串行逻辑的原始部分重写为判断逻辑的不同分支,并确保最终可以正常执行。
在开始之前,让我问您一个问题:是否有一种方法可以执行和中的语句,如以下示例所示:
如果我说如果我只调用这个方法一次,那么我可以在和中同时输出print语句。您肯定会说这是不可能的,因为它违反了Java中判断逻辑的基本常识。
是的,如果上面的修饰符只调用“once”方法,则没有人可以这样做。然而,上述功能可以通过在判断条件中稍微移动来实现。要查看修改后的代码,请执行以下操作:
运行后,控制台打印:
惊讶毫无准备。事实上,执行死刑的秘密在于判断条件。
第一次调用该方法时,不满足或不满足操作中的第一个条件。因此,当执行第二个条件时,将执行匿名内部类中实例化的初始块代码,并再次执行该方法。此时,条件满足,因此执行第一条print语句。
实例化的新对象不满足以下方法中的条件,因此它不满足中的任何条件。因此,将执行中的语句,并将执行第二条打印语句。
这样,曲面只调用该方法一次,同时执行语句块。以这种方式将整个逻辑分为两部分,以混淆您的同事,怎么样。
在程序员的世界里,不同语言之间总是存在一系列的蔑视。例如,写C的人看不起写Java的人,因为内存的直接操作看起来很高,不是吗 所以今天我们假装成一个C语言程序员,用java来操作少量内存。
如何做到这一点,或者使用Java中的magic类。从名称可以看出,如果使用不当,设备就不是很安全,因此很难获得实例。你需要通过反思:
有了这个对象,我们可以使用内存做任何我们想做的事情。例如,当我们实现这样一个简单的赋值时,我们可以将其变得更复杂,如下所示:
首先,通过此方法应用4字节的内存空间,然后通过此方法写入1,然后从此地址读取一个类型为length的变量。最后,实现了将1分配给的操作。
当然,还有许多更高级的用途。这里有两个简单的例子。
在上面的代码中,该方法将类型1写入每个字节,最后调用该方法一次读取4个字节作为类型变量的值。该代码的最终打印结果为,对应的二进制如下:
对于C语言中的内存复制,很容易使用:
在上述代码中,通过此方法重新分配了8字节的内存空间,前4字节的内存空间被复制到内存空间两次。将打印上述代码:
这是因为存储在新的8字节内存空间中的二进制数字如下所示,它们在转换为十进制类型时完全对应。
除了直接操作内存空间外,unsafe还具有线程调度、对象操作、CAS操作等实用功能。如果您想了解更多信息,可以查看Java双刃剑中不安全类的详细描述,打开通向新世界的大门。
好了,这是无用的知识介绍的结束。我相信,在掌握了这些技能之后,每个人都可以带来自己混乱的代码氛围,编写不同的鞭打代码。
最后,建议在项目中编写此类代码时,最好将其与红花油和碰伤酒一起使用。
好了,这就是分享的全部内容。我是Hydra。请参阅下一篇文章。