实际上,字节码构造函数的规则比Java的规则要宽松得多.

唯一的规则是必须在任何正常返回的路径上调用一个构造函数,如果构造函数调用抛出异常,那么您也必须抛出异常.

除此之外,这意味着构造函数可能包含对其他构造函数的多个调用,或者根本不包含任何构造函数.

无论如何,确定给定的invokespecial调用是否正在初始化当前对象的唯一保证方法是进行数据流分析,因为可以初始化同一类的其他对象,这会混淆一个天真的检测器.

编辑:这是一个完全有效的类(使用Krakatau汇编语法)的示例,显示了您可能遇到的一些问题.除此之外,它还调用同一个类中的其他构造函数,构造函数的递归调用,以及在构造函数中构造同一个类的其他对象.

.class public ctors

.super java/lang/Object

; A normal constructor

.method public : ()V

.limit locals 1

.limit stack 1

aload_0

invokespecial java/lang/Object ()V

return

.end method

; A weird constructor

.method public : (I)V

.limit locals 2

.limit stack 5

iload_1

ifne LREST

aload_0

invokespecial ctors ()V

return

LREST:

aload_0

new ctors

iinc 1 -1

iload_1

LFAKE_START:

invokespecial ctors (I)V

LFAKE_END:

iconst_0

invokespecial ctors (I)V

return

.catch [0] from LFAKE_START to LFAKE_END using LCATCH

LCATCH:

aload_0

invokespecial java/lang/Object ()V

return

.end method

.method public static main : ([Ljava/lang/String;)V

.limit locals 1

.limit stack 2

new ctors

iconst_5

invokespecial ctors (I)V

return

.end method

java super.start,java – 在字节码中确定哪里是super()方法调用所有构造函数必须在JVM上执行...相关推荐

  1. 【Java 虚拟机原理】Class 字节码二进制文件分析 二 ( 常量池位置 | 常量池结构 | tag | info[] | 完整分析字节码文件中的常量池二进制数据 )

    文章目录 前言 一.常量池结构分析 1.常量池位置 2.常量池结构 3.常量池单个常量 4.常量池单个常量 tag 标签 二.常量池字节码文件分析 0.常量池附加信息 1.常量池 #1 常量分析 2. ...

  2. [Java安全]—动态加载字节码文件

    ClassLoader加载远程字节码 POC import java.io.IOException; import java.net.URL; import java.net.URLClassLoad ...

  3. 【Java 虚拟机原理】动态字节码技术 | Dalvik ART 虚拟机 | Android 字节码打包过程

    文章目录 一.动态字节码技术 二.Dalvik & ART 虚拟机 三.Android 字节码打包过程 总结 一.动态字节码技术 动态字节码技术 就是在 运行时 , 动态修改 Class 字节 ...

  4. 【Java 虚拟机原理】Class 字节码二进制文件分析 七 ( 局部变量表分析 )

    文章目录 前言 一.编译生成带局部变量表的字节码文件 二.局部变量表 前言 上一篇博客 [Java 虚拟机原理]Class 字节码二进制文件分析 二 ( 常量池位置 | 常量池结构 | tag | i ...

  5. 【Java 虚拟机原理】Class 字节码二进制文件分析 六 ( 属性类型 | Code 属性 | 属性名称索引 | 属性长度 | 操作数栈最大深度 | 局部变量存储空间 | 字节码长度 )

    文章目录 前言 一.属性类型 二.Code 属性表数据结构 三.属性名称索引 四.属性长度 五.操作数栈最大深度 六.局部变量存储空间 七.字节码长度 八.存储字节码指令的一系列字节流 前言 上一篇博 ...

  6. 【Java 虚拟机原理】Class 字节码二进制文件分析 五 ( 方法计数器 | 方法表 | 访问标志 | 方法名称索引 | 方法返回值类型 | 方法属性数量 | 方法属性表 )

    文章目录 前言 一.方法表结构 二.方法计数器 三.方法表数据解析 ( init 构造方法 ) 1.方法访问标志 2.方法名称索引 3.方法返回类型 4.方法属性数量 前言 上一篇博客 [Java 虚 ...

  7. 【Java 虚拟机原理】Class 字节码二进制文件分析 四 ( 字段表数据结构 | 字段表详细分析 | 访问标志 | 字段名称 | 字段描述符 | 属性项目 )

    文章目录 前言 一.字段表总数据结构 二.访问标志 三.字段名称 四.字段描述符 五.属性项目数 前言 上一篇博客 [Java 虚拟机原理]Class 字节码二进制文件分析 三 ( 访问和修饰标志 | ...

  8. 【Java 虚拟机原理】Class 字节码二进制文件分析 三 ( 访问和修饰标志 | 类索引 | 父类索引 | 接口计数器 | 接口表 | 字段计数器 | 字段表 )

    文章目录 前言 一.访问和修饰标志 二.类索引 三.父类索引 四.接口计数器 五.接口表 六.字段计数器 七.字段表 前言 上一篇博客 [Java 虚拟机原理]Class 字节码二进制文件分析 二 ( ...

  9. 深入浅出Java复用类【从字节码角度看toString调用机制、对象代理、组合与继承、转型、final、初始化】

    这个世界上有10种人:一种是懂二进制的,一种是不懂二进制的 你觉得类是在什么时候被加载的?[访问static域时,为什么?看完9就明白了] 文章目录 1.深入理解Java中toString方法的调用机 ...

最新文章

  1. java 调度项目_Java任务调度
  2. AI 发展方向大争论:混合AI ?强化学习 ?将实际知识和常识整合到AI中 ?
  3. 学界 | UC伯克利发布一个低成本家居机器人,会叠衣服、会泡咖啡
  4. [洛谷2月月月赛]富金森林公园
  5. Bootstrap按钮使用
  6. mariadb导入sql数据_「译」关系型数据库介绍
  7. 代码重构 防火墙 相关知识
  8. Easyui的DateBox日期格式化
  9. java axure_【Java】Axure线框图
  10. 实现用户注册功能---文件保存信息,如果用户名存在就死循环继续
  11. JDBC数据库连接小白教程
  12. b g opencv读入的图片 r,OpenCV 读取摄像头并显示图像的R、G、B三个通道的直方图...
  13. 2019数据安装勾选_建筑CAD首选软件~【T20 天正建筑 V5.0 安装教程】
  14. IT培训行业揭秘(一)
  15. 星际争霸2Beta版单机使用方法
  16. 解决IntelliJ IDEA Properties中Unused property提示
  17. MongoDB时间加减操作记录
  18. 汉堡式折叠html,3种超酷汉堡包菜单按钮变形动画特效
  19. 中国塑料电镀市场预测及投资价值报告(2022版)
  20. 算法:Climbing Stairs(爬楼梯) 6种解法

热门文章

  1. 阿里立秋:AI千人千面,淘宝如何做智能化UI测试?
  2. Activiti 多个并发子流程的应用
  3. jeecg 服务器 + linux + nginx 安装
  4. 【Matlab】private文件夹
  5. Python学习十大良好习惯
  6. hadoop--HDFS_DataNode工作机制
  7. MySQL基础(三)表关系及数据的增删改查
  8. 会计丑闻之后 东芝“迎来”第五次延交财报
  9. python 类里面的单下划线与双下划线的区别(私有和保护) .
  10. 【HDU 5532 Almost Sorted Array】水题,模拟