【什么是动态链接?这里的动态是什么意思?链接了什么?】


动态链接(Dynamic Linking)详解


1. 什么是动态链接?

动态链接是 Java 虚拟机(JVM)在运行时将字节码中的符号引用(Symbolic Reference)转换为直接引用(Direct Reference)的过程。
核心目的
支持多态性(Polymorphism)和动态绑定(Dynamic Binding),确保方法调用能根据对象的实际类型找到正确的方法实现。
类比
类似于“电话簿查询”——在打电话(调用方法)时,根据名字(符号引用)查号码(直接引用),而不是提前写死号码。


2. 这里的“动态”是什么意思?

“动态”体现在以下两个方面:

  1. 时机:在程序运行时(而非编译时)完成链接。
  2. 灵活性:允许根据运行时的实际类型动态绑定方法(如多态调用)。

对比静态链接
静态链接(如C/C++):编译时直接确定函数地址,无法支持多态。
动态链接(JVM):运行时根据对象类型动态解析,支持多态。

示例

Animal animal = new Dog();  
animal.eat();  // 运行时动态确定调用Dog.eat(),而非Animal.eat()

3. 动态链接“链接”了什么?

动态链接主要处理字节码中的符号引用,将其转换为以下具体目标的直接引用

符号引用类型直接引用形式作用
类/接口引用类/接口在方法区中的内存地址确定依赖的类或接口(如new操作)。
方法引用方法入口地址(JVM方法表指针)支持多态方法调用(如invokevirtual)。
字段引用字段在对象内存中的偏移量读取或修改对象的字段值。

4. 动态链接的流程
  1. 符号引用解析
    类加载阶段:加载目标类(如Dog)。
    解析阶段:将符号引用转换为直接引用。
  2. 方法表(vtable)维护
    • 每个类维护一个虚方法表,存储所有可重写方法的入口地址。
  3. 动态绑定
    • 调用方法时,根据对象的实际类型(动态类型)查找方法表,获取直接引用。

示例

// 字节码中的符号引用:Animal.eat()
invokevirtual #10  // 常量池第10项为方法符号引用
// 运行时解析为Dog.eat()的直接引用(方法入口地址0x7f8e2c)

5. 动态链接的应用场景
  1. 多态方法调用
    List<String> list = new ArrayList<>();
    list.add("data");  // 运行时动态绑定到ArrayList.add()
    
  2. 反射调用
    Method method = clazz.getMethod("getName");
    method.invoke(obj);  // 动态解析方法地址
    
  3. 动态代理
    Proxy.newProxyInstance(...);  // 运行时生成代理类并链接方法
    

6. 动态链接的意义
  1. 支持多态:允许子类重写父类方法,实现运行时灵活绑定。
  2. 延迟绑定:类加载和解析按需进行,避免一次性加载所有依赖。
  3. 跨平台性:符号引用与具体平台无关,直接引用由各平台JVM实现负责适配。

总结

维度说明
动态链接本质运行时将符号引用转换为直接引用,支持多态和动态绑定。
“动态”含义运行时解析、按需绑定。
链接内容类/接口地址、方法入口地址、字段偏移量。
核心价值实现Java的多态性、反射、动态代理等高级特性,提升代码灵活性和扩展性。

理解动态链接机制,有助于优化代码设计(如合理使用多态)和排查方法调用异常(如NoSuchMethodError)。

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

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

相关文章

AWS S3深度剖析:云存储的瑞士军刀

1. 引言 在当今数据驱动的世界中,高效、可靠、安全的数据存储解决方案至关重要。Amazon Simple Storage Service (S3)作为AWS生态系统中的核心服务之一,为企业和开发者提供了一个强大而灵活的对象存储平台。本文将全面解析S3的核心特性,帮助读者深入理解如何充分利用这一&q…

【Game】Powerful——Martial Arts Challenge(6)

文章目录 攻略关卡一&#xff08;虎子&#xff09;关卡二关卡三关卡四关卡五关卡六——奇穷 攻略 关卡一&#xff08;虎子&#xff09; 参战选手 出手顺序 关卡二 参战选手 出手顺序 关卡三 参战选手 出手顺序 关卡四 参战选手 出手顺序 关卡五 参战选手 出手顺序 关卡六…

PPIO × UI-TARS:用自然语言操控电脑,AI Agent 的极致体验

Manus的爆火预示着AI 正在从单纯的文本生成和图像识别迈向更复杂的交互场景。字节跳动近期推出的开源项目 UI-TARS Desktop 为我们展示了一种全新的可能性&#xff1a;能够通过自然语言理解和处理来控制计算机界面。这款工具代表了人工智能与人机交互领域的重大突破&#xff0c…

电脑屏保壁纸怎么设置 桌面壁纸设置方法详解

电脑桌面壁纸作为我们每天面对的第一视觉元素&#xff0c;不仅能够彰显个人品味&#xff0c;还能营造舒适的工作或娱乐氛围。电脑桌面壁纸怎么设置呢&#xff1f;下面本文将为大家介绍Windows和macOS两大主流操作系统中设置电脑桌面壁纸的方法&#xff0c;帮助大家快速设置个性…

popupwindow拦截返回点击

目的&#xff1a;弹窗只有点击按钮可以关闭。 前提&#xff1a;弹窗内有输入框 试了网上的一些方法 设置弹窗焦点 setFocusable(false) &#xff08;会导致软键盘无法显示&#xff09;重写 onBackPressed 方法 &#xff08;不会走这里&#xff09;为 popupwindow 设置 onKey…

数学知识——矩阵乘法

使用矩阵快速幂优化递推问题 对于一个递推问题&#xff0c;如递推式的每一项系数都为常数&#xff0c;我们可以使用矩阵快速幂来对算法进行优化。 一般形式为&#xff1a; F n F 1 A n − 1 F_nF_1A^{n-1} Fn​F1​An−1 由于递推式的每一项系数都为常数&#xff0c;因此对…

GitHub 趋势日报 (2025年04月07日)

GitHub 趋势日报 (2025年04月07日) 本日报由 TrendForge 系统生成 https://trendforge.devlive.org/ &#x1f4c8; 今日整体趋势 Top 10 排名项目名称项目描述今日获星语言1microsoft/markitdownPython tool for converting files and office documents to Markdown.⭐ 1039P…

ROS多设备交互

ROS多设备连接同一个Master&#xff1a;ROS Master多设备连接-CSDN博客 在多个PC端连接同一个ROS Master后&#xff0c;接下来就可以实现不同设备之间的话题交流&#xff0c;Master主机端启动不同PC端的功能包等功能了 尽管多个PC端拥有不同的ROS工作空间&#xff0c;但是只要…

基于国内环境 在Ubuntu 上安装 Docker 指南

前言 在容器化技术主导云原生时代的今天&#xff0c;Docker 凭借其轻量化、高移植性和秒级部署能力&#xff0c;已成为开发与运维的必备工具。然而&#xff0c;国内用户在 Ubuntu 系统上安装 Docker 时&#xff0c;常因 ​官方镜像源访问受限、网络延迟高、依赖包安装失败 等问…

数据结构:二叉树(三)·(重点)

二叉树的存储结构 ⼆叉树⼀般可以使⽤两种结构存储&#xff0c;⼀种顺序结构&#xff0c;⼀种链式结构。 顺序结构 顺序结构存储就是使⽤数组来存储&#xff0c;⼀般使⽤数组只适合表⽰完全⼆叉树&#xff0c;因为不是完全⼆叉树会有 空间的浪费&#xff0c;完全⼆叉树更适合…

EasyExcel实现图片导出功能(记录)

背景&#xff1a;在旧系统的基础上&#xff0c;导出一些工单信息时&#xff0c;现需要新添加处理人的签名或者签章&#xff0c;这就涉及图片的上传、下载、写入等几个操作。 1、EasyExcel工具类 &#xff08;1&#xff09;支持下拉框的导出。 import com.alibaba.excel.Easy…

Android Material Design 3 主题配色终极指南:XML 与 Compose 全解析

最小必要颜色配置 <!-- res/values/themes.xml --> <style name"Theme.MyApp" parent"Theme.Material3.DayNight"><!-- 基础三原色 --><item name"colorPrimary">color/purple_500</item><item name"col…

【Git】“warning: LF will be replaced by CRLF”的解决办法

一、原因分析 不同操作系统的换行符标准不同&#xff1a; • Windows&#xff1a;使用 CRLF&#xff08;\r\n&#xff09;表示换行&#xff1b; • Linux/Mac&#xff1a;使用 LF&#xff08;\n&#xff09;表示换行 Git 检测到本地文件的换行符与仓库设置或目标平台不兼容时…

PyTorch 深度学习实战(33):联邦学习与隐私保护

在上一篇文章中,我们探讨了多模态学习与CLIP模型的应用。本文将深入介绍联邦学习(Federated Learning)这一新兴的分布式机器学习范式,它能够在保护数据隐私的前提下实现多方协作的模型训练。我们将使用PyTorch实现一个基础的联邦学习框架,并在图像分类任务上进行验证。 一…

蓝桥杯 web 展开你的扇子(css3)

普通答案&#xff1a; #box:hover #item1{transform: rotate(-60deg); } #box:hover #item2{transform: rotate(-50deg); } #box:hover #item3{transform: rotate(-40deg); } #box:hover #item4{transform: rotate(-30deg); } #box:hover #item5{transform: rotate(-20deg); }…

LLM驱动的智能体:基于GPT的对话智能体开发指南

前言 大语言模型&#xff08;LLM, Large Language Model&#xff09;正在彻底改变智能体&#xff08;Agent&#xff09;的设计和实现方式。从简单的聊天机器人到复杂的自动化助手&#xff0c;基于GPT等LLM的对话智能体已经在客服、教育、办公自动化、编程助手等领域得到了广泛…

深度解析 C# 中介者模式:设计与实战应用

中介者模式&#xff08;Mediator Pattern&#xff09;是一种行为型设计模式&#xff0c;其核心思想是将多个对象之间的交互集中到一个中介者对象中&#xff0c;从而减少对象之间的直接交互&#xff0c;降低耦合度。在实现复杂系统时&#xff0c;中介者模式有助于提高系统的可维…

每日算法-250408

记录今天解决的两道 LeetCode 算法题&#xff0c;主要涉及二分查找的应用。 1283. 使结果不超过阈值的最小除数 题目描述 思路 核心思路是 二分查找。 解题过程 为什么可以使用二分&#xff1f; 关键在于单调性。对于一个固定的数组 nums&#xff0c;当除数 divisor 增大时&…

MySQL的子查询

一、前言 MySQL 子查询是指嵌套在其他 SQL 语句&#xff08;如 SELECT、WHERE、FROM 等&#xff09;内部的查询。用于辅助主查询完成复杂的数据筛选或计算。 二、子查询分类 标量子查询 描述&#xff1a;返回 单行单列&#xff08;一个值&#xff09;&#xff0c;常用于比较运…

Linux 基础入门操作 前言 VIM的基本操作 2

1 VIM的背景介绍 Vi 的诞生与1976年&#xff0c;Vim 的前身是 Vi&#xff08;Visual Editor&#xff09;&#xff0c;由 Bill Joy 在 BSD Unix 系统上开发&#xff0c;作为 ed&#xff08;行编辑器&#xff09;的改进版本&#xff0c;提供全屏编辑功能&#xff0c;成为 Unix/L…