神代码鉴赏

news2024/11/25 18:47:42

1:瞒天过海

猜下如下代码会输出啥:

public static void main(String[] args) {
    // \u000d System.out.println("coder Hydra");
}

啥也不输出,不,看结果:
在这里插入图片描述

神奇吧!这是因为\u000d就是换行符的unicode编码,Java编译器会将其编译为换行符,如下编译后的结果:
在这里插入图片描述

这就很好理解了,如果用这种方式来埋个坑,还真是不太好发现。
这个代码:

public static void main(String[] args) {
    int a=1;
    // \u000d \u0061\u002b\u002b\u003b
    System.out.println(a);
}

运行后是2,因为:
在这里插入图片描述

这个待优化代码逼格更高了:

public static void main(String[] args) throws Exception {
    long startTime = System.currentTimeMillis();
    //\u000d\u0054\u0068\u0072\u0065\u0061\u0064\u002e\u0073\u006c\u0065\u0065\u0070\u0028\u0032\u0030\u0030\u0030\u0029\u003b
    System.out.println("waste: " + (System.currentTimeMillis() - startTime));
}

如下:
在这里插入图片描述

客户说慢,只有你知道为啥,你这个机灵鬼!!!

2:舍近求远

如果等于0咋的咋的,如果等于1咋的咋的逻辑咋写,这样?:

public void judge(int x){
    if (x>0){
        //...
    }else if (x<0){
        //...
    }
}

NONONO,是这样:

public void judge2(int x){
    if (x>>>31==0){
        //...
    }else if (x>>>31==1){
        //...
    }
}

这个逻辑还是正确的,如下:
在这里插入图片描述

扩展一点知识,这个代码运行结果是啥:

public static void main(String[] args) throws Exception {
    int x = 345;
    int what = Integer.MAX_VALUE >> 31 >> 1;
    System.out.println(what);
}

看下:

0

Process finished with exit code 0

0,那这样呢:

public static void main(String[] args) throws Exception {
    int x = 345;
    int what = x >> 32;
    System.out.println(what);
}

是不是也是0,不是的,看结果:
在这里插入图片描述

为啥???这是因为在执行移位运算前,Java会对操作符右边的操作数执行模32的运算,即上述代码其实是int what = x >> (32%32);就是int what = x >> 0;相当于啥也不做,即限制每次右移4个字节。

3:颠倒黑白

static {
    try {
        // 获取Boolean类中的TRUE变量,即public static final Boolean TRUE = new Boolean(true);
        Field trueField = Boolean.class.getDeclaredField("TRUE");
        // 暴力访问
        trueField.setAccessible(true);

        Field modifiersField = Field.class.getDeclaredField("modifiers");
        modifiersField.setAccessible(true);
        // 去掉final修饰符
        // 因为public static final Boolean TRUE = new Boolean(true);的定义是public static final,而这三个修饰符对应整数值如下:
        /*
        public static final int PUBLIC           = 0x00000001;   ---1
                                                                    +
        public static final int STATIC           = 0x00000008;   ---8
                                                                    +
        public static final int FINAL            = 0x00000010;   ---16
                                                                    共25
        trueField.getModifiers() 因此该值为25,而trueField.getModifiers() & ~Modifier.FINAL相当于是将
        public static final 变为 public static,即public static Boolean TRUE = new Boolean(true);
        此时modifier变为25-16=9
            */
        modifiersField.setInt(trueField, trueField.getModifiers() & ~Modifier.FINAL);
        // final已经去掉了,就可以反射修改其值为false了
        trueField.set(null, false);
    } catch(IllegalAccessException | NoSuchFieldException e) {
        e.printStackTrace();
    }
}

public static void main(String[] args) {
    Boolean reality = true;
    if(reality) {
        System.out.println("true");
    } else {
        System.out.println("false");
    }
}

以上代码输出啥?看结果:

false

Process finished with exit code 0

奥秘都在静态代码块了,写了详细的注释,自己看下。

4:釜底抽薪

如下直接操作内存代码:

public static void main(String[] args) throws Exception {
    // 获取unsafe
    Field unsafeField = Unsafe.class.getDeclaredField("theUnsafe");
    unsafeField.setAccessible(true);
    Unsafe unsafe =(Unsafe) unsafeField.get(null);

    // 申请4字节 的内存
    long addr = unsafe.allocateMemory(4);
    // 设置值1
    unsafe.putInt(addr,1);
    // 注意这里输出的是随机值,因为分配的四字节内存,可能是任意4个字节,而该四字节因为还没有清除之前存储的数据,所以当前是什么内容是不确定的
    // 你可以试下,每次运行结果都是不一样的
    System.out.println(addr);
    // 转int,并清理 内存之前的脏数据
    int a=unsafe.getInt(addr);
    System.out.println(a);
    // 释放内存
    unsafe.freeMemory(addr);
}

运行:

55516032
1

Process finished with exit code 0

抄的这里的文章 。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/949379.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

hive表向es集群同步数据20230830

背景&#xff1a;实际开发中遇到一个需求&#xff0c;就是需要将hive表中的数据同步到es集群中&#xff0c;之前没有做过&#xff0c;查看一些帖子&#xff0c;发现有一种方案挺不错的&#xff0c;记录一下。 我的电脑环境如下 软件名称版本Hadoop3.3.0hive3.1.3jdk1.8Elasti…

Oralce Client11和PL/SQL12安装

初始环境&#xff1a; 1.阿里云轻量应用服务器已经安装Oracle11g https://blog.csdn.net/testleaf/article/details/111826134 2.阿里云轻量应用服务器已经配置Oracle11g https://blog.csdn.net/testleaf/article/details/109096654 具体目标&#xff1a; 1.安装Oralce Client1…

盘点国内2023上半年低无代码平台TOP10:你用了哪款?

随着数字化转型的加速&#xff0c;无代码/低代码平台以其高效、灵活和易用的特性&#xff0c;正在改变着企业应用开发和部署的方式。这些平台正在成为越来越多企业的首选&#xff0c;因为他们可以快速构建和部署应用&#xff0c;以适应不断变化的业务需求。在这个热潮背后&…

【CSS】解决对齐的小问题

问题&#xff1a; 表单或者页面上可能遇到文字无法对平均分&#xff0c;带有冒号的文本无法左右对齐的情况 常见的解决方式&#xff1a; 解决如下图 仍无法解决对齐的问题&#xff0c;还需要考虑字数 解决 这里用css的方式解决 增加 i 标签 固定宽度&#xff0c;设置 i …

IT 支持人员如何应对现代教育技术挑战

将技术融入教学实践为教育行业带来了重大变化。特别是近几年&#xff0c;技术在教育机构提供的产品和服务水平方面发挥了越来越重要的作用。 随着混合灵活教学&#xff08;HyFlex&#xff09;教学模式成为新的当务之急&#xff0c;学生和教职员工都希望技术能够满足自己对灵活…

Java实现根据关键词搜索当当商品列表数据方法,当当API接口申请指南

要通过当当网的API获取商品列表数据&#xff0c;您可以使用当当开放平台提供的接口来实现。以下是一种使用Java编程语言实现的示例&#xff0c;展示如何通过当当开放平台API获取商品列表&#xff1a; 首先&#xff0c;确保您已注册成为当当开放平台的开发者&#xff0c;并创建…

CSS学习笔记02

CSS笔记02 美化网页元素 为什么要美化网页 目的&#xff1a; 有效的传递页面信息美化网页、页面漂亮、才能吸引用户突显页面的主题提高用户的体验 span标签 span标签是短语内容的通用行内容器&#xff0c;它本身并没有任何特殊语义。 通常我们使用span标签来把我们想要重…

【1654. 到家的最少跳跃次数】

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 有一只跳蚤的家在数轴上的位置 x 处。请你帮助它从位置 0 出发&#xff0c;到达它的家。 跳蚤跳跃的规则如下&#xff1a; 它可以 往前 跳恰好 a 个位置&#xff08;即往右跳&#xff09;。它可以 …

BRAM资源不够用?不怕!这里有FPGA BRAM省资源小秘招!

FPGA的BRAM和LUT等资源都是有限的&#xff0c;在FPGA开发过程中&#xff0c;可能经常遇到BRAM或者LUT资源不够用的情况。 一般建议BRAM和LUT资源的消耗不要超过80%&#xff0c;当然高端一点的FPGA芯片也可以放宽到90%&#xff0c;超过这个限制&#xff0c;可能就会出现时序违例…

必看!银行业软件测试岗位需求暴增的原因解密!

根据2023年3月中共中央、国务院印发《党和国家机构改革方案》&#xff0c;要求统筹推进中国人民银行分支机构改革。包括&#xff1a;撤销中国人民银行大区分行及分行营业管理部、总行直属营业管理部和省会城市中心支行&#xff0c;在31个省&#xff08;自治区、直辖市&#xff…

【解决】提示“找不到该项目的文件或文件夹如何删除”办法

在删除一些文件或文件夹中出现操作错误&#xff0c;后面想删除文件或文件夹时&#xff0c;弹出以下的状态栏提示↓↓↓ 此时无论怎么重启计算机还是快捷键都删除不了。 那么可采取下面的方法&#xff1a; ① 在该文件或文件夹内新建记事本&#xff0c;在记事本中输入以下代码…

QT设置mainwindow的窗口title

QT设置mainwindow的窗口title 在QT程序中&#xff0c;通常会有**aaaa-[bbbbbbb]**这种形式的title&#xff0c;对于刚上手qt的程序员同学&#xff0c;可能会简单的以为修改这种title&#xff0c;就是使用setWindowTitle这个接口&#xff0c;其实只对了一半&#xff0c;这种形式…

SpringBoot 使用 EMQX

一、SpringBoot服务器端 1. 在centos搭建 EMQX服务 2. 创建API密码 3. 在SpringBoot 的yml中添加mqqt的配置 #配置 emqx:ip: 47.109.49.176port: 18083api: xxxxxxxx &#xff08;自己的api&#xff09;secret: xxxxxxxxx &#xff08;自己的secret&#xff09; 4. 因为…

GPT4不限使用、内容加密更安全,ChatGPT企业版能否成为公司必备工具?

近日&#xff0c;OpenAI推出了ChatGPT企业版&#xff0c;这款AI助手为企业提供了更快速度的不限次数使用的GPT4。它还包括可以扩展上下文窗口以处理更长文本、加密、企业级安全与隐私保护&#xff0c;以及账户组管理功能。 在ChatGPT成功推出9个月后&#xff0c;这款流行的聊…

x86 汇编手册快速入门

本文翻译自&#xff1a;Guide to x86 Assembly 在阅读 Linux 源码之前&#xff0c;我们需要有一些 x86 汇编知识。本指南描述了 32 位 x86 汇编语言编程的基础知识&#xff0c;包括寄存器结构&#xff0c;数据表示&#xff0c;基本的操作指令&#xff08;包括数据传送指令、逻…

42、Flink 的table api与sql之Hive Catalog

Flink 系列文章 1、Flink 部署、概念介绍、source、transformation、sink使用示例、四大基石介绍和示例等系列综合文章链接 13、Flink 的table api与sql的基本概念、通用api介绍及入门示例 14、Flink 的table api与sql之数据类型: 内置数据类型以及它们的属性 15、Flink 的ta…

匠心新品:大彩科技超薄7寸WIFI线控器发布,热泵、温控器、智能家电首选!

一、产品介绍 此次发布一款7寸高清全新外壳产品&#xff0c;让HMI人机界面家族再添一新成员。该产品相比其他外壳有以下5个大改动&#xff1a; 1 表面玻璃盖板使用2.5D立体结构&#xff1b; 2 液晶盖板采用一体黑设计&#xff0c;且液晶屏与触摸板是全贴合结构&#xff1b; …

leetcode 84. 柱状图中最大的矩形

2023.8.30 本题和接雨水 有点类似&#xff0c;依旧用双指针来解。但是本题要记录的是当前柱子 左右两侧第一个小于该柱子的索引。将其保存在两个数组中&#xff0c;最后再求最大面积。代码如下&#xff1a; class Solution { public:int largestRectangleArea(vector<int&g…

图表背后的故事:数据可视化的威力与影响

数据可视化现在在市场上重不重要&#xff1f;这已经不再是一个简单的问题&#xff0c;而是一个不可忽视的现实。随着信息时代的来临&#xff0c;数据已经成为企业和组织的核心资产&#xff0c;而数据可视化则成为释放数据价值的重要工具。 在当今竞争激烈的商业环境中&#xf…

css换行

强制显示一行&#xff0c;超出... .box{white-space: nowrap; /* 强制显示一行 */overflow: hidden;text-overflow: ellipsis; /* 超出... */ } 自动换行 一般默认制动换行 .box1{word-wrap:break-word; } 显示2行&#xff0c;超出... .box2 {overflow: hidden;display: -…