【JVM】- 类加载与字节码结构2

编译期处理(语法糖)

java编译器把.java源码编译成.class字节码的过程,自动生成和转换的一些代码。

默认构造器

public class Candy01 {
}

编译成class后的代码

public class Candy1 {public Candy1(){super();}
}

自动拆装箱(jdk5加入)

public class Candy02 {public static void main(String[] args) {/*** jdk5之前:* Integer x = Integer.valueOf(1);* int y = x.intValue();*/Integer x = 1; // 自动拆箱int y = x; // 自动装箱}
}

泛型集合取值

public class Candy03 {public static void main(String[] args) {List<Integer> list = new ArrayList<>();list.add(10); // 实际调用:List.add(Object e)Integer x = list.get(0); // 实际调用的是 Object obj = List.get(int idx);}
}

编译器在获取真正字节码时,需要额外做一个类型转换的操作:

Integer x = (Integer)list.get(0);

可变参数

public class Candy04 {public static void foo(String... args) {String[] array = args;System.out.println(array);}public static void main(String[] args) {foo("hello", "world");}
}

编译后的代码:

public class Candy04 {public static void foo(String[] args) {String[] array = args;System.out.println(array);}public static void main(String[] args) {foo(new String[]{"hello", "world"});}
}

如果调用了foo(),则等价于foo(new String[]{}),创建了一个空数组,而不会直接传null进去

数组 - foreach循环

public class Candy05_01 {public static void main(String[] args) {int[] array = {1, 2, 3, 4, 5};for(int e : array) {System.out.println(e);}}
}

会被编译为:

int[] array = new int[]{1, 2, 3, 4, 5};
for(int i = 0; i < array.length; i++) {int e = array[i];System.out.println(e);
}

List - foreach循环

public class Candy05_02 {public static void main(String[] args) {List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);for(Integer i : list) {System.out.println(i);}}
}

会被编译成:

Iterator it = list.iterator();
while(it.hasNext()) {Integer e = (Integer) it.next();System.out.println(e);
}

foreach循环写法可以配合数组,以及所有实现了Iterator接口的集合类一起使用

switch - 字符串

public class Candy06_01 {public static void choose(String str) {switch(str) {case "hello": {System.out.println("h");break;}case "world": {System.out.println("w");break;}}}
}

会被编译成:

public class Candy06_01 {public static void choose(String str) {byte x = -1;switch(str.hashCode()) {case 99162322:  // "hello"的hash值if (str.equals("hello")) {x = 0;}break;case 113318802:  // "world"的hash值if (str.equals("world")) {x = 1;}}switch(x) {case 0:System.out.println("h");break;case 1:System.out.println("w");}}
}

编译后其实是执行了两次switch

  • 第一次是根据hash和equals将字符串转换为相应的byte类型
  • 第二次才是利用byte进行比较。

第一遍使用hashCode进行比较,是为了提高效率,较少可能的比较;而equals是为了防止hash冲突。

switch - 枚举类

enum Sex {MALE, FEMALE
}
public class Candy06_02 {public static void foo(Sex sex) {switch(sex) {case MALE: {System.out.println("男");break;}case FEMALE: {System.out.println("女");break;}}}
}

编译后代码:

public class Candy06_02 {public static void foo(Sex sex) {// 获取枚举的序号(MALE.ordinal() = 0, FEMALE.ordinal() = 1)int ordinal = sex.ordinal(); switch (ordinal) {case 0:  // MALESystem.out.println("男");break;case 1:  // FEMALESystem.out.println("女");break;}}
}

枚举类

enum Sex {MALE, FEMALE
}

转换后代码:

public final class Sex extends java.lang.Enum<Sex> {// 枚举常量(public static final)public static final Sex MALE;public static final Sex FEMALE;// 私有构造函数(enum 不能外部实例化)private Sex(String name, int ordinal) {super(name, ordinal);}// 静态初始化块(初始化所有枚举值)static {MALE = new Sex("MALE", 0);FEMALE = new Sex("FEMALE", 1);$VALUES = new Sex[]{MALE, FEMALE};}// 自动生成的方法:values() 返回所有枚举值public static Sex[] values() {return (Sex[])$VALUES.clone();}// 自动生成的方法:valueOf(String) 根据名字返回枚举public static Sex valueOf(String name) {return (Sex)Enum.valueOf(Sex.class, name);}// 内部存储所有枚举值的数组private static final Sex[] $VALUES;
}

try-with-resources简化资源关闭

public class Candy07 {public static void main(String[] args) {/*try(资源变量 = 创建资源对象) {}catch() {}*/try(InputStream is = new FileInputStream("d:\\test.txt")) {System.out.println(is);}catch (Exception e) {e.printStackTrace();}}
}

其中:资源对象需要实现AutoCloseable接口,例如:InputStreamOutPutStreamConnectionStatementResultSet等接口都实现了AutoCloseable接口,使用try-with-resources可以不用写finally语句,编译器会帮助我们生成资源关闭的代码。

上边代码被编译为:

public class Candy07 {public static void main(String[] args) {try {InputStream is = new FileInputStream("d:\\test.txt");Throwable t = null;try {System.out.println(is);}catch (Throwable e1){t = e1; // t是我们代码中出现的异常throw e1;} finally {// 判断了资源不为空if(is != null) {// 如果我们的代码有异常if(t != null) {try {is.close();} catch (Throwable e2) {// 如果close出现异常,作为被压制异常添加t.addSuppressed(e2);}}else {// 如果代码没有异常,close出现的异常就是最后catch块中的eis.close();}}}}catch (IOException e) {e.printStackTrace();}}
}

如果我们的代码出现了异常,并且关闭资源的时候又出现了异常,如果想让这两个异常都显示,可以使用压制异常

例如:

public class Candy08 {public static void main(String[] args) {try (MyResource resource = new MyResource()) {int i = 1 / 0; // 除0异常}catch (Exception e) {e.printStackTrace();}}
}
class MyResource implements AutoCloseable {@Overridepublic void close() throws Exception {throw new Exception("close异常"); // 资源关闭异常}
}

输出:在这里插入图片描述
两个异常都会被抛出

方法重写时的桥接方法

class A {public Number m() {return 1;}
}
class B extends A {@Override// 子类m方法的返回值是Integer,是父类m方法返回值Number的子类public Integer m() {return 2;}
}

编译后的代码:

class B extends A {public Integer m() {return 2;}// 此方法才是真正重写了父类public Number m()方法public synthetic bridge Number m() {// 调用public Integer m()return m();}
}

桥接方法比较特殊,只对java虚拟机可见,与原来的public Integer m(),没有命名冲突。

无参的匿名内部类

public class Candy08 {public static void main(String[] args) {Runnable runnable = new Runnable() {@Overridepublic void run() {System.out.println("ok");}};}
}

编译后代码:

// 额外生成的类
final class Candy08$1 implements Runnable {Candy08$1() {}@Overridepublic void run() {System.out.println("ok");}
}
public class Candy08 {public static void main(String[] args) {Runnable runnable = new Candy08$1();}
}

引用局部变量的匿名内部类

public class Candy10 {public static void test(final int x) {Runnable runnable = new Runnable() {public void run() {System.out.println(x);}};}
}

编译后:

// 额外生成的类
final class Candy10$1 implements Runnable {int val$x;Candy10$1(int x) {this.val$x = x;}public void run() {System.out.println(this.val$x);}}
public class Candy10 {public static void test(final int x) {Runnable runnable = new Candy10$1(x);}
}

这也解释了为什么匿名内部类里边使用的变量必须使用final修饰:因为在创建Candy10$1对象时,将x的值赋值给了Candy10$1对象的val$x属性,所以x的值不会在发生变化了。如果发生变化,那么val$x属性没有机会再跟着一起变化了。

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

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

相关文章

WSL2 中安装 cuDNN​​ 的完整指南

以下是关于 ​​cuDNN​​ 的详细介绍及在 ​​WSL2 中安装 cuDNN​​ 的完整指南&#xff0c;结合权威资料整理而成&#xff1a; &#x1f4da; ​​一、cuDNN 深度解析​​ ​​1. 定义与作用​​ ​​cuDNN​​&#xff08;CUDA Deep Neural Network Library&#xff09;是…

Apache Doris FE 问题排查与故障分析全景指南

前言&#xff1a; FE&#xff08;Frontend&#xff09;是 Apache Doris 集群架构中的“大脑”&#xff0c;负责元数据管理、查询解析和调度等关键任务。一旦 FE 出现问题&#xff0c;整个集群的稳定性和可用性将受到严重影响。因此&#xff0c;掌握 FE 故障定位与排查方法对于保…

RK AndroidFramework 内置应用可,卸载,恢复出厂设置恢复安装

device/rockchip/rk356x/rk3568_r/preinstall_del/Android.mkdevice/rockchip/rk356x/rk3568_r/preinstall_del/Android.mk include $(call all-subdir-makefiles) 拿内置LoyversePos应用做例子 device/rockchip/rk356x/rk3568_r/preinstall_del/preinstall.mk PRODUCT_PACK…

一文了解Blob文件格式,前端必备技能之一

文章目录 前言一、什么是Blob&#xff1f;二、Blob的基本特性三、Blob的构造函数四、常见使用场景1. 文件下载2. 图片预览3. 大文件分片上传 四、Blob与其他API的关系1. File API2. FileReader3. URL.createObjectURL()4. Response 五、性能与内存管理六、实际案例&#xff1a;…

LLMs 系列实操科普(4)

六、deep research 这是 chatgpt 推出的功能&#xff0c;但我这里是免费用户&#xff0c;一个月才有 5 次使用机会&#xff0c;而且使用的是轻量化模型版本&#xff0c;相对体验上比较鸡肋一些。 那这个深度思考研究是个什么东西呢&#xff1f; 根据 openai 对其的解释是&…

若依框架前端调用后台服务报跨域错误

背景&#xff1a;使用若依框架的前后端分离项目&#xff0c;前后端开发在同一个办公室情况下前端调用后端服务提示如下报错&#xff1a;Access to XMLHttpRequest at http://ip1:8089/online/layer/dataType from origin http://ip2:6090 has been blocked by CORS policy: Res…

PHP商城源码:构建高效电商平台的利器

一、PHP商城源码的核心优势 1. **开源免费&#xff0c;降低成本** PHP作为开源语言&#xff0c;拥有庞大的开发者社区&#xff0c;成熟的商城源码&#xff08;如EcShop、OpenCart&#xff09;可免费获取&#xff0c;大幅降低企业的技术投入成本。 2. **开发效率高** PHP语法…

【学习笔记】C++代码规范整理

【学习笔记】C代码规范整理 一、匿名空间namespace 匿名命名空间&#xff08;Anonymous Namespace&#xff09;是一种特殊的命名空间声明方式&#xff0c;其作用是将声明的成员限定在当前编译单元&#xff08;源文件&#xff09;内可见&#xff0c;类似于使用 static 关键字修…

数学复习笔记 29 不定积分

前言 复习的时候时常复习一下以前复习的高数&#xff0c;温故而知新&#xff0c;可以为师矣。现实生活中有非常多让我难受的事情&#xff0c;贤者模式的时候也会对一些自己的行为嗤之以鼻&#xff0c;复习考研对其他三门科目都没有学出来正反馈&#xff0c;只能从数学这儿找一…

微软因安全漏洞禁用黑暗环境下的Windows Hello面部识别功能

面部识别技术在各种场景中的应用日益广泛&#xff0c;但身份欺诈事件仍时有发生&#xff0c;这表明即使面部识别也并非万无一失。在某些情况下&#xff0c;这些系统可能被攻击者利用。 漏洞发现与应对措施 近期&#xff0c;微软在Windows 10和11系统中禁用了黑暗环境下使用Wi…

产品经理课程(十五)实战点评(3)

&#xff08;一&#xff09;复习 需求文档是产品的说明书 需求文档包含&#xff1a;修订记录、背景、主要流程、详细功能逻辑、数据上报&#xff0c;发布策略 bug也是需求文档的一部分 &#xff08;二&#xff09;案例讲解 案例一&#xff1a; 一个版本里面的4-5个功能点就比…

大模型量化与剪枝

大模型量化&#xff0c;剪枝 量化有助于减少显存使用并加速推理 GPTQ 等后训练量化方法(Post Training Quantization)是一种在训练后对预训练模型进行量化的方法。 ### model model_name_or_path: meta-llama/Meta-Llama-3-8B-Instruct template: llama3### export export_di…

Oracle 数据库数据操作:精通 INSERT, UPDATE, DELETE

作者&#xff1a;IvanCodes 日期&#xff1a;2025年6月18日 专栏&#xff1a;Oracle教程 在 Oracle 数据库中&#xff0c;对表内数据进行增加、修改和删除操作是通过数据操作语言 (DML - Data Manipulation Language) 来完成的。核心的DML语句包括 INSERT (插入新数据), UPDATE…

推荐使用的Unity插件(InputSystem)

本文将提供更简洁的步骤和常见问题解决。 一、极简入门步骤&#xff1a; 安装&#xff1a;Package Manager中安装Input System&#xff08;确保Unity版本在2019.4&#xff09; 创建Input Actions&#xff1a; 在Project窗口右键 -> Create -> Input Actions 双击打开…

清理 Docker 容器日志文件方法

操作总结与问题解析 一、操作目的与背景 用户旨在清理 Docker 容器日志文件以释放服务器存储空间,主要通过以下命令组合完成操作: 查看容器日志空间占用清空指定容器的日志文件验证容器运行状态与日志清理效果二、关键命令与输出解析 1. 查看 Docker 容器日志空间占用 du…

图片压缩工具 | 按指定高度垂直切割图片

OPEN-IMAGE-TINY&#xff0c;一个基于 Electron VUE3 的图片压缩工具&#xff0c;项目开源地址&#xff1a;https://github.com/0604hx/open-image-tiny ℹ️ 需求描述 在上一篇文章一段代码利用 snapdom 将 CSDN 博文转化为长图片&#xff08;PNG/JPG/PDF&#xff09;中&…

山东大学软件学院创新项目实训开发日志——第十七周(二)

目录 1.优化前端日历页面显示&#xff0c;增加鼠标悬停显示当日会议基本信息的效果。 2.优化会议计划生成与会议PPT生成功能&#xff0c;使得能够加载多页docx文件与PDF文件 3.优化了会议PPT生成功能&#xff0c;使得可以上传多个文件并根据多个文件生成会议PPT 4.修改了识…

Ubuntu 使用kubeadm部署k8s系统组件反复重启的问题

系统&#xff1a;Ubuntu 24.04 LTS 问题现象&#xff1a;kubeadm init 后系统组件proxy、apiserver、etcd等频繁挂掉重启 问题原因&#xff1a;cgroup配置问题 解决方法&#xff1a; 编辑系统cgroup默认配置文件 sudo nano /etc/default/grub 将GRUB_CMDLINE_LINUX_DEFAU…

Oracle获取执行计划之EXPLAIN PLAN 技术详解

#Oracle #执行计划 #EXPLAIN PLAN 一、引言 在Oracle数据库性能优化中&#xff0c;​执行计划&#xff08;Execution Plan&#xff09;​是理解SQL语句如何被数据库处理的关键工具。EXPLAIN PLAN是Oracle提供的一种静态分析SQL执行路径的方法&#xff0c;它通过生成逻辑执行…

【论文阅读】Qwen2.5-VL Technical Report

Arxiv:https://arxiv.org/abs/2502.13923 Source code:https://github.com/QwenLM/Qwen2.5-VL Author’s Institution&#xff1a;Alibaba 背景 多模态大模型 多模态大模型MultiModal Large Language Models (MM-LLMs) 的发展可以通过一篇综述了解&#xff1a;MM-LLMs: Re…