当前位置: 首页 > news >正文

宁德建设网站中国航发网上商城

宁德建设网站,中国航发网上商城,wordpress中文视频插件下载地址,网站建设方案书内容管理制度这里写目录标题 前言IDEA下查看字节码的两种方法使用idea自带的插件工具安装插件 为什么没有看出方法调用关系原因分析工厂举例 知识补充语言java可移植性 总结 前言 画时序图的时候#xff0c;我想验证下方法的调用是否写的正确。方法调用不仅涉及到程序的基本逻辑流程#… 这里写目录标题 前言IDEA下查看字节码的两种方法使用idea自带的插件工具安装插件 为什么没有看出方法调用关系原因分析工厂举例 知识补充语言java可移植性 总结 前言 画时序图的时候我想验证下方法的调用是否写的正确。方法调用不仅涉及到程序的基本逻辑流程还深刻影响着程序的性能、内存管理以及异常处理等多个方面。然而仅凭源代码层面的阅读和理解往往难以窥见方法调用背后复杂的运行时行为这时就可以通过查看字节码的方式去理解。 先解释一下字节码是什么作为Java虚拟机JVM直接执行的语言是Java源代码经过编译器编译后生成的中间代码形式。它介于高级语言和机器语言之间既保留了高级语言的可读性又具备机器语言的高效执行特性后面知识扩充有详细讲解。通过分析和解读字节码可以直观地看到方法调用的具体实现细节包括参数传递、栈帧管理、局部变量表操作等底层操作这对于调试、性能优化乃至安全分析都大有裨益。 时序图作为一种常用的UML统一建模语言图表类型能够清晰地展示对象之间按时间顺序的消息传递和交互行为。通过绘制时序图可以直观地理解方法调用的顺序、参与对象及其状态变化这对于设计复杂系统、验证业务逻辑尤为重要。然而时序图通常是基于设计阶段的假设和预期构建的其准确性需要通过实际运行时的行为来验证。 本文主要想介绍一下通过IDEA如何查看Java字节码文件。后面还有大转折哦~ IDEA下查看字节码的两种方法 使用idea自带的插件工具 首选打开Java源文件确保你的Java源文件已经被编译成.class文件。通常IDEA会在你构建项目时自动进行编译。 view下面的show bytecode这是IntelliJ IDEA中一个用于查看Java字节码的工具 之后就会出现字节码文件的窗口这个窗口默认是悬浮的你可以通过点击右上角的“钉子”图标将其固定住以便更方便地查看。 这种方法比较简单直接view菜单下就有 安装插件 在IntelliJ IDEA中可以通过菜单栏的“File”-“Settings”或使用快捷键CtrlAltS打开设置面板。     在设置面板中找到并点击“Plugins”选项。在插件市场的搜索框中输入“jclasslib”然后回车进行搜索。 在搜索结果中找到Jclasslib插件并点击“Install”按钮进行安装。 如果弹出对话框选择“Accept”或“同意”以继续安装。 安装完成后需要重启IDE以使插件生效。 这里是已经安装好了–Jclasslib Bytecode Viewer 重启之后 选中要反编译的类 view中选中 Show bytecode with jclasslib 就会弹出字节码窗口 下图是常量池     作用保存了字符串常量、类或接口名、字段名等符号引用和字面值常量。常量池是字节码文件中占用空间最大的部分之一它避免了相同内容的重复定义从而节省了空间。     结构每个常量池项都有一个索引通过索引可以快速访问到对应的常量。常量池中的数据项包括标志位表示常量的类型、长度和有效值等。 查看方法调用只看到调了接口和抽象类 知道多态的一定都知道多态的一个关键特性就是运行时Runtime动态绑定方法调用。这意味着当通过父类的引用调用一个被子类重写Override的方法时实际调用的是子类中的实现而不是父类中的实现。 具体来说多态允许一个父类类型的变量引用一个子类的对象。在编译时Compile Time这个引用被视为父类类型但在运行时RuntimeJVM会根据对象的实际类型来确定调用哪个具体的方法。这种机制使得程序能够表现出更加灵活和动态的行为。 为什么没有看出方法调用关系 原因分析 关于上面的这点再细致分析一下     时序图主要展示的是对象之间的交互顺序以及这些交互发生的时间顺序它确实是描述运行时关系调用的有力工具。然而反编译后的字节码与时序图所呈现的信息在抽象层次和用途上存在显著差异。 反编译后的字节码是Java程序源代码经过编译后生成的中间代码字节码主要描述了程序的结构、操作码以及操作数等信息但它并不直接展示对象之间的交互顺序或运行时调用关系。 要理解运行时的调用关系通常需要借助调试工具、日志记录、性能分析工具或专门的运行时分析工具。这些工具可以在程序执行时捕获对象之间的交互信息包括方法调用、消息传递、异常处理等、 也就是说时序图用于描述和展示运行时的对象交互顺序而反编译后的字节码虽然包含了程序的结构和操作信息但并不直接展示这些运行时交互。要理解运行时的调用关系需要借助其他工具和方法。这点我后续会再写一篇文章 工厂举例 再来看一个例子 // 父类 class Animal {void makeSound() {System.out.println(Some generic animal sound);} }// 子类1 class Dog extends Animal {Overridevoid makeSound() {System.out.println(Woof);} }// 子类2 class Cat extends Animal {Overridevoid makeSound() {System.out.println(Meow);} }// 工厂 class AnimalFactory {static Animal createAnimal(String type) {if (type.equals(dog)) {return new Dog();} else if (type.equals(cat)) {return new Cat();} else {return new Animal();}} }public class Main {public static void main(String[] args) {Animal myDog AnimalFactory.createAnimal(dog);Animal myCat AnimalFactory.createAnimal(cat);myDog.makeSound(); // 输出: WoofmyCat.makeSound(); // 输出: Meow} }在这个例子中AnimalFactory 类中的createAnimal方法是一个简单工厂它根据传入的字符串参数返回不同类型的 Animal 对象。在main方法中创建了两个 Animal类型的引用 myDog 和 myCat但实际上它们分别指向了 Dog 和 Cat对象。 查看这段代码的字节码会看到类似以下的内容简化版 // 省略了其他部分的字节码... public static void main(java.lang.String[]);Code:0: ldc #7 // String dog2: invokestatic #8 // Method AnimalFactory.createAnimal:(Ljava/lang/String;)LAnimal;5: astore_16: ldc #9 // String cat8: invokestatic #8 // Method AnimalFactory.createAnimal:(Ljava/lang/String;)LAnimal;11: astore_212: aload_113: invokevirtual #10 // Method Animal.makeSound:()V16: aload_217: invokevirtual #10 // Method Animal.makeSound:()V20: return在字节码中 一样只能看到对 Animal类的makeSound方法的调用invokevirtual #10而无法直接看到这些调用实际上是在Dog 或 Cat对象上执行的。这是因为多态性的实现是在运行时由JVM动态绑定的而不是在编译时静态确定的。 因此虽然字节码提供了程序的结构和操作信息但它并不直接展示运行时的多态性和方法调用关系。要理解这些运行时行为需要运行程序并观察其实际输出或者使用调试工具来跟踪程序的执行过程。 知识补充 语言 一、高级语言     高级语言是一种接近人类自然语言和数学语言的编程语言它使得程序员能够使用相对简单的语法和语义来编写程序。高级语言具有高度的抽象性和可读性能够大大简化编程过程提高开发效率。常见的高级语言包括Java、Python、C等。 二、中间码中间语言     中间码或中间语言是介于高级语言和机器语言之间的一种特殊形式的代码。它是编译器在将高级语言源代码翻译成机器语言目标代码的过程中产生的一种中间表示。中间码具有逻辑结构清晰、不依赖目标机结构等特点使得编译器能够对其进行优化生成更高质量的机器代码。常见的中间码形式包括后缀式、抽象语法树、三地址码等。.class文件就是一种中间码它包含了Java程序编译后的字节码。这些字节码不是直接由计算机的CPU执行而是由Java虚拟机JVM解释和执行。这种中间码的设计使得Java程序具有跨平台的特性因为只要目标平台上有兼容的JVM.class文件文件就可以在该平台上运行而无需对源代码进行任何修改或重新编译。 三、机器语言     机器语言是计算机能够直接识别和执行的二进制指令集。它由一系列由0和1组成的二进制代码构成这些代码直接对应于计算机硬件中的电路和逻辑设计。机器语言是计算机硬件与软件之间的桥梁是计算机能够执行任何程序的基础。然而由于机器语言的复杂性和难以记忆性它并不适合人类直接编写程序。 java可移植性 不同的操作系统拥有各自专属的JVMJava虚拟机而Java编写的程序正是通过这些JVM来执行。由于JVM能够在各种操作系统上实现Java字节码.class文件的跨平台运行因此Java程序无需针对特定系统进行修改或重新编译即可在不同的操作系统上无缝运行。这一特性使得Java成为了一种极具可移植性的编程语言开发者只需编写一次Java代码便能在多种平台上轻松部署和运行。 总结 在软件开发过程中如何确保所绘制的时序图准确地反映了程序的实际运行时行为为了解决这一问题我引入了反编译工具Jclasslib该工具能够帮助我们查看Java程序的字节码从而间接地了解程序的结构和方法调用情况。然后我详细介绍了Jclasslib的使用方法包括如何安装、配置以及利用该工具查看Java类的字节码。 然而在深入探索字节码的过程中我发现了一个有趣的现象字节码文件中并不能直接看到运行时的方法调用。这一发现引发了我对于高级语言、中间码和机器语言之间关系的深入思考。文章对此进行了详细解释指出高级语言编写的代码经过编译后生成中间码如Java字节码而中间码再由JVMJava虚拟机解释或编译成机器码执行。在这个过程中多态性和动态绑定等特性使得运行时的实际方法调用在字节码层面并不明显。
http://www.w-s-a.com/news/463720/

相关文章:

  • 网站建设属于哪种公司电子商务查询网站
  • 工程建设标准强制性条文最新版本网站关键词排名优化应该怎么做
  • 网站网页设计内容品牌高端网站建设公司
  • 网站开发报价 福州中国建筑网官网手机版
  • 网站 图片 自动往右移专门做定制化的网站
  • 最好用的cms手机百度关键词排名 网站优化软件
  • 凉山州城乡规划建设局网站长沙网站建设哪家强
  • 广州网站开发创意设计公司企业自己怎么制作网站首页
  • 曲靖 曲靖网站建设软件(app)开发wordpress 没有远程发布
  • 官方网站开发与定制网站建设技术是干嘛的
  • 昆明网站建设工作室网站菜单导航怎么做的
  • 南京网站做的好的公司猪八戒网站做推广怎么样
  • 建站收费标准福州网站搭建
  • 做防护用品的网站欧美网站建设风格特点
  • 龙华做网站联系电话北京软件开发培训班
  • 做网站运营有前途网站的建设与管理的心得体会
  • 河南网站推广怎么做网页制作免费下载
  • 网站如何屏蔽中国ip商丘网站建设的公司哪家好
  • 东莞广告公司东莞网站建设价格鹤壁哪有做网站的
  • 门户网站界面设计logo设计商标设计
  • 建设银行网站驱动宁波网站建设相信荣胜网络
  • 八里河网站建设项目建设可行性企业品牌推广方式有哪些
  • jsp网站开发之html入门知识广州服装设计公司
  • 做电商看的网站有哪些个人网页制作成品免费
  • 沈阳建站多少钱境外网站 备案
  • 提交网站收录入口斗图在线制作
  • 建设化妆品网站服务医药网站前置审批
  • 购物网站修改注册信息模块的分析怎么注册公司logo
  • 那个网站可以做域名跳转的青岛网站建设定制
  • 网站登记模板互联网技术发展及其影响的调查