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

asp网站建设 aws建网站哪家好北京

asp网站建设 aws,建网站哪家好北京,视频一页网站怎么做,苏州网络公司排名一览文章目录 介绍-方法调用指令1.invokestatic静态方法测试类反编译字节码 2.invokespecial特殊方法测试类反编译字节码 3.invokeinterface接口方法测试类反编译字节码 4.invokedynamic动态调用方法测试类反编译字节码 5.invokevirtual虚方法测试类反编译字节码 介绍-方法调用指令… 文章目录 介绍-方法调用指令1.invokestatic静态方法测试类反编译字节码 2.invokespecial特殊方法测试类反编译字节码 3.invokeinterface接口方法测试类反编译字节码 4.invokedynamic动态调用方法测试类反编译字节码 5.invokevirtual虚方法测试类反编译字节码 介绍-方法调用指令 首先要清楚的是在Java中有关字节码文件的编译过程不包含传统程序语言编译的连接步骤一切方法调用在字节码文件中只是符号引用而不是在方法在实际运行时内存布局中的入口地址也就是直接引用。 在上一篇文章《探索JVM类加载机制》中分析了在类加载的解析阶段会将一部分的符号引用转化为直接引用这种解析能够成立的前提条件就是方法在程序真正运行之前就有一个可以确定的调用版本并且这个方法的调用版本在运行期间是不可变的也就是该方法调用具有唯一的目标方法。从程序的角度而言调用目标在程序代码写好编译器进行编译的那一刻就已经确定下来了这类方法的调用称之为解析。 在《Java虚拟机规范》中有以下五种方法调用字节码指令 invokestatic用于调用静态方法。invokespecial用于调用实例构造器init()私有方法和父类中的方法。invokeinterface用于调用接口方法会在运行时确定一个实现该接口的对象。invokedynamic在运行时动态解析初调用点限定符所引用的方法然后在执行该方法。invokevirtual用于调用所有的虚方法。 下面将会演示以上五种指令的实际应用在介绍之前需要借助Java开发工具包JDK中提供的一个命令行工具 javap用于反编译Java字节码以便深入了解和分析已编译的Java类文件。指令如下有关其详细介绍内容读者可从网上查阅在此不赘述。 # -verbose 会显示与指定类相关的字节码指令、常量池、方法、字段和其他类信息。 javap -verbose [字节码文件的路径]1.invokestatic 静态方法测试类 public class StaticMethodCallInstruction {public static void main(String[] args) {int num getNum(1); // 根据下方反编译结果可知此处会生成一个invokestatic指令用于调用MethodgetNum:(I)ISystem.out.println(num);}// 静态方法该方法编译后简单名称为getNum描述符为(I)I根据上一篇文章所述在进行方法搜索时会匹配到该方法。public static int getNum(int i){ return i;}}反编译字节码 # 执行命令 javap -verbose /target/classes/com/mytest/project/method/call/StaticMethodCallInstruction.class # 以下仅展示主要内容并会简单介绍一下相关内容其他与本次案例无关的内容将省略# 常量池表类型结构 Constant pool:#2 Methodref #5.#27 // com/mytest/project/method/call/StaticMethodCallInstruction.getNum:(I)I#3 Fieldref #28.#29 // java/lang/System.out:Ljava/io/PrintStream;#4 Methodref #30.#31 // java/io/PrintStream.println:(I)V#5 Class #32 // com/mytest/project/method/call/StaticMethodCallInstruction#27 NameAndType #21:#22 // getNum:(I)I#28 Class #34 // java/lang/System#29 NameAndType #35:#36 // out:Ljava/io/PrintStream;#30 Class #37 // java/io/PrintStream#31 NameAndType #38:#39 // println:(I)V#32 Utf8 com/mytest/project/method/call/StaticMethodCallInstruction# main方法 public static void main(java.lang.String[]);# 描述符descriptor: ([Ljava/lang/String;)V# 访问标记flags: (0x0009) ACC_PUBLIC, ACC_STATIC# 方法属性表Code:# 操作数栈深度局部变量表的大小方法参数表的大小stack2, locals2, args_size10: iconst_11: invokestatic #2 // Method getNum:(I)I4: istore_15: getstatic #3 // Field java/lang/System.out:Ljava/io/PrintStream;8: iload_19: invokevirtual #4 // Method java/io/PrintStream.println:(I)V12: return# 行号映射表源码与code属性中的索引LineNumberTable:line 12: 0line 13: 5line 14: 12# 局部变量表LocalVariableTable:Start Length Slot Name Signature0 13 0 args [Ljava/lang/String;5 8 1 num I# 方法参数表MethodParameters:Name Flagsargs# getNum方法public static int getNum(int);descriptor: (I)Iflags: (0x0009) ACC_PUBLIC, ACC_STATICCode:stack1, locals1, args_size10: iload_01: ireturnLineNumberTable:line 17: 0LocalVariableTable:Start Length Slot Name Signature0 2 0 i IMethodParameters:Name Flagsi 2.invokespecial 特殊方法测试类 //父类 public class ParentMethod {public void parentMethod(){return;}}// 子类 public class SpecialMethodCallInstruction extends ParentMethod {// 无参构造器public SpecialMethodCallInstruction(){}public void demo() {// 调用实例构造器方法new SpecialMethodCallInstruction(); // class com/mytest/project/method/call/SpecialMethodCallInstruction// 调用私有方法test(); // Method test:()V// 调用父类方法super.parentMethod(); // Method com/mytest/project/method/ParentMethod.parentMethod:()V// 该方法在编译时会被认为时虚方法需要显示调用父类方法才会执行invokespecialparentMethod(); // Method parentMethod:()V}// 私有方法private void test(){return;}}反编译字节码 public void demo();descriptor: ()Vflags: (0x0001) ACC_PUBLICCode:stack2, locals1, args_size10: new #2 // class com/mytest/project/method/call/SpecialMethodCallInstruction3: dup4: invokespecial #3 // Method init:()V7: pop8: aload_09: invokespecial #4 // Method test:()V12: aload_013: invokespecial #5 // Method com/mytest/project/method/ParentMethod.parentMethod:()V16: aload_017: invokevirtual #6 // Method parentMethod:()V20: returnLineNumberTable:line 18: 0line 20: 8line 22: 12line 24: 16line 25: 20LocalVariableTable:Start Length Slot Name Signature0 21 0 this Lcom/mytest/project/method/call/SpecialMethodCallInstruction;3.invokeinterface 接口方法测试类 public class InterfaceMethodCallInstruction implements InterfaceMethod {public void demo(){InterfaceMethod interfaceMethod new InterfaceMethodCallInstruction();// 调用接口方法interfaceMethod.iMethod(); // com/mytest/project/method/call/intf/InterfaceMethod.iMethod:()V}Overridepublic void iMethod() {return;} } 反编译字节码 public void demo();descriptor: ()Vflags: (0x0001) ACC_PUBLICCode:stack2, locals2, args_size10: new #2 // class com/mytest/project/method/call/InterfaceMethodCallInstruction3: dup4: invokespecial #3 // Method init:()V7: astore_18: aload_19: invokeinterface #4, 1 // InterfaceMethod com/mytest/project/method/call/intf/InterfaceMethod.iMethod:()V14: returnLineNumberTable:line 14: 0line 15: 8line 16: 14LocalVariableTable:Start Length Slot Name Signature0 15 0 this Lcom/mytest/project/method/call/InterfaceMethodCallInstruction;8 7 1 interfaceMethod Lcom/mytest/project/method/call/intf/InterfaceMethod; 4.invokedynamic invokedynamic 指令用于在运行时动态确定要调用的方法。与传统的 invokevirtual、invokeinterface 等指令不同invokedynamic 指令将查找目标方法的决定权从虚拟机转嫁到具体用户代码之中每一处含有invokedynamic指令的位置都称做“动态调用点”Dynamic Call Site这条指令的第一个参数不再是代表方法符号引用的CONSTANT_Methodref_info常量而是变为JDK 1.7新加入的CONSTANT_InvokeDynamic_info常量从这个新常量中可以得到3项信息引导方法Bootstrap Method此方法存放在新增的BootstrapMethods属性中、方法类型MethodType和名称。 引导方法是 invokedynamic 指令的核心部分它负责在运行时生成和链接要调用的方法。引导方法是一个普通的Java方法但它具有特殊的签名和参数。引导方法的参数包括 一个查找器Lookup对象用于查找和创建方法句柄、构造函数句柄等一个名称Name对象表示要调用的方法的名称一个方法类型MethodType对象表示要调用的方法的参数类型和返回类型可变数量的静态参数这些参数是传递给引导方法的附加信息用于生成和链接目标方法。 引导方法的主要任务是根据这些参数动态生成和链接目标方法。生成目标方法的过程可以是通过反射API查找已存在的方法也可以是动态生成新的方法例如使用ASM库或Java编译器API。链接目标方法的过程是将生成的目标方法与invokedynamic指令关联起来以便在运行时正确调用。 当JVM执行到 invokedynamic 指令时它会首先查找与该指令关联的引导方法。引导方法根据传入的参数动态生成和链接目标方法并返回一个称为“调用站点”CallSite的对象。调用站点对象封装了目标方法的所有信息包括方法句柄、参数类型和返回类型等。 一旦调用站点对象被创建并返回给 invokedynamic 指令JVM就会将该指令与调用站点对象关联起来。在后续的执行过程中当再次遇到相同的invokedynamic指令时JVM会直接通过调用站点对象调用目标方法而无需再次执行引导方法。这种机制可以显著提高动态方法调用的性能。 以上说明内容参考链接https://blog.csdn.net/li371518473/article/details/136646069 动态调用方法测试类 public class DynamicMethodCallInstruction {public void demo(){Thread thread new Thread(() - {int i 0;i;});thread.run();}}反编译字节码 public void demo();descriptor: ()Vflags: (0x0001) ACC_PUBLICCode:stack3, locals2, args_size10: new #2 // class java/lang/Thread3: dup4: invokedynamic #3, 0 // InvokeDynamic #0:run:()Ljava/lang/Runnable; // 其中#0表示#BootstrapMethods属性表的第0项9: invokespecial #4 // Method java/lang/Thread.init:(Ljava/lang/Runnable;)V12: astore_113: aload_114: invokevirtual #5 // Method java/lang/Thread.run:()V17: returnLineNumberTable:line 14: 0line 18: 13line 19: 17LocalVariableTable:Start Length Slot Name Signature0 18 0 this Lcom/mytest/project/method/call/DynamicMethodCallInstruction;13 5 1 thread Ljava/lang/Thread;# BootstrapMethods属性 BootstrapMethods:# LambdaMetafactory.metafactory会生成一个实现了函数式接口的匿名内部类并实例化然后委托给MethodHandle返回一个CallSite对象。该CallSite类型的对象实现对目标方法也就是run()的调用0: #26 REF_invokeStatic java/lang/invoke/LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;Method arguments:#27 ()V#28 REF_invokeStatic com/mytest/project/method/call/DynamicMethodCallInstruction.lambda$demo$0:()V#27 ()V 5.invokevirtual 在Java 语言能在解析阶段中唯一确定其调用版本的方法有静态方法、私有方法、实例构造器、父类方法以及被final修饰的方法这5种方法会在类加载的时候就可以把符号引用解析为该方法的直接引用入口地址。这些方法统称为“非虚方法”相反其他方法被称之为“虚方法”。 所以通常认为虚方法是指在类加载阶段这里指的是解析阶段都不能确定方法调用的直接引用而只有在运行时才能确定的方法。 由于历史设计的原因被 final修饰的实例方法是使用 invokevirtual 指令来调用的但是因为其无法被覆盖没有其他版本的可能所以方法接受者也不需要进行多态选择又或者说多态选择的结果是唯一的。所以在《Java语言规范》中明确定义了被 final修饰的方法是一种非虚方法。 虚方法测试类 public class VirtualMethodCallInstruction {public void demo(){// 调用final修饰的实例方法实际上是非虚方法但是指令为invokevirtualfMethod();// 调用final修饰的类方法指令为invokestaticsfMethod();}public final void fMethod(){return;}public static final void sfMethod(){return;}}反编译字节码 public void demo();descriptor: ()Vflags: (0x0001) ACC_PUBLICCode:stack1, locals1, args_size10: aload_01: invokevirtual #2 // Method fMethod:()V4: invokestatic #3 // Method sfMethod:()V7: returnLineNumberTable:line 13: 0line 15: 4line 16: 7LocalVariableTable:Start Length Slot Name Signature0 8 0 this Lcom/mytest/project/method/call/VirtualMethodCallInstruction;
http://www.pierceye.com/news/83779/

相关文章:

  • 推进政务服务网站一体化建设泰州做网站淘宝
  • 哈尔滨市网站建设公司西安哪家公司做的网站好
  • 做网站需要多少钱一个月北京软件技术有限公司
  • 辽宁省品牌建设促进会网站贵阳设计工作室
  • php做的一个网站虚拟机可以做两个网站
  • 洛阳市河阳建设工程有限公司网站wordpress主题 清新
  • 国外做设计赚钱的网站天津武清做淘宝网站
  • 新乡建网站营销网站的渠道构成基本包括
  • 西宁seo网站盲盒小程序源码
  • 家庭农场做网站企业管理咨询公司收费标准
  • 网站首页结构怎么写建设手机银行app下载
  • 盐城网站优化工作室提供微网站制作电话
  • 网站设计 推广wordpress文件结构详解
  • 新开传奇网站单职业wordpress页面添加js
  • 做弹幕网站wordpress 文档插件
  • 做网站后的收获百度搜索优化
  • 百度有网站建设吗网站打开慢什么原因
  • 珠海网站建设咨询安徽住房和城乡建设厅官网
  • 做网站设计需求今天重大新闻国内最新消息
  • 男的怎么做直播网站asp做购物网站
  • php做调查问卷网站备案域名被拿去做违法
  • 建立网站来网上销售的英文网站项目开发流程有哪七步
  • 做的网站一直刷新洛阳霞光做网站的公司
  • 网站怎么做运营推广wordpress主题很慢
  • 涉县住房与城乡建设厅网站上海网站建设哪里好
  • 做五金外贸哪个网站比较好鄱阳做网站
  • 商业网站开发岗位需求分析网站建设销售开场
  • 上海营销平台网站建设深深圳的网站建设公司
  • 网站建设专员工作总结网站建设对接视频
  • 南京 网站备案为外国企业做中文网站建设