通过java字节码分析学习对象初始化顺序

代码如下:

mockery.checking(new Expectations() {

{
               one(new Object()).toString();
               will(returnValue(""));
           }
       });

下面写一个写一个简单的类演示这个例子

代码如下:

public class Test {

int i = 1;
    {
        int j = 1;
        System.out.println(j);
    }

public Test(){
i = 2;
}
static{

}

}

以前一直使用static{}代码快,原来可以直接写{}代码块

通过对java字节码分析,发现代码的执行顺序如下:

1 首先是执行对象的构造器方法,创建一个空的对象,然后对对象的字段i赋予默认值。也就是先执行 i = 0 (这一部应该是原子性的)

2 然后依次对字段进行赋值,在我们这个例子里面,只有一个字段i,所以执行 i = 1,这个是字段初始化过程

4 字段初始化完成之后再 执行类的{}语句块,如果有多个{}语句块,则按照代码顺序依次执行

3 {}语句执行完成之后,则执行构造器方法i = 2

(0)

相关推荐

  • java 获取字节码文件的几种方法总结

    java 获取字节码文件的几种方法总结 在本文中,以Person类为例,将分别演示获取该类字节码文件的三种方式, 其具体思想及代码如下所示: public class Person { private int age; private String name; public Person() { System.out.println("person run"); } public Person(String name, int age) { this.age = age; this.n

  • java 中如何获取字节码文件的相关内容

    java 中如何获取字节码文件的相关内容 反射机制是指在运行状态中,对任意一个类(class文件),都能知道这个类的所有属性和方法:对任意一个对象,都能调用这个对象的方法和属性.这种动态的获取信息和动态的调用对象的方法的功能称为--Java语言的反射机制. 简单点说,动态的获取类中的信息,这就是Java的反射机制. 在Java的反射机制中,我们可以通过配置文件信息,然后通过类名来获取类中包含的详细信息,如构造函数.成员变量和成员函数等.在接下来,作者将分别演示如何通过类名来获取类中包含的信息.

  • java字节码框架ASM操作字节码的方法浅析

    之前我们已经对ASM进行的详细的介绍,需要的朋友们可以点击这里:java字节码框架ASM的深入学习 JVM的类型签名对照表 Type Signature Java Type Z boolean B byte C char S short I int J long F float D double L fully-qualified-class ;fully-qualified-class [ type type[] ( arg-types ) ret-type method type 比如,ja

  • Java字节码指令集的使用详细

    Java虚拟机指令由一个字节长度的.代表某种特定含义的操作码(Opcode)以及其后的零个至多个代表此操作参数的操作数构成.虚拟机中许多指令并不包含操作数,只有一个操作码.若忽略异常,JVM解释器使用一下为代码即可有效工作. 复制代码 代码如下: do{    自动计算PC寄存器以及从PC寄存器的位置取出操作码    if(存在操作数) 取出操作数;    执行操作码所定义的操作;}while(处理下一次循环) 操作数的数量以及长度,取决于操作码,若一个操作数长度超过了一个字节,将会以Big-E

  • java字节码框架ASM的深入学习

    一.什么是ASM ASM是一个java字节码操纵框架,它能被用来动态生成类或者增强既有类的功能.ASM 可以直接产生二进制 class 文件,也可以在类被加载入 Java 虚拟机之前动态改变类行为.Java class 被存储在严格格式定义的 .class文件里,这些类文件拥有足够的元数据来解析类中的所有元素:类名称.方法.属性以及 Java 字节码(指令).ASM从类文件中读入信息后,能够改变类行为,分析类信息,甚至能够根据用户要求生成新类. 使用ASM框架需要导入asm的jar包,下载链接:

  • Java 将字符串动态生成字节码的实现方法

    可以生成可执行的class文件 直接上能执行代码: 复制代码 代码如下: public class Test { /**  * @param args  */@SuppressWarnings("static-access")public static void main(String[] args) {  try {   new Test().calculate("234 - ( 1 + 45 * 4 ) / 5");  } catch (Exception e)

  • 通过java字节码分析学习对象初始化顺序

    复制代码 代码如下: mockery.checking(new Expectations() { {               one(new Object()).toString();               will(returnValue(""));           }       }); 下面写一个写一个简单的类演示这个例子 复制代码 代码如下: public class Test { int i = 1;    {        int j = 1;       

  • Java——对象初始化顺序使用详解

    一. 代码块的概念 在探究对象初始化顺序之前,我们先通过代码来了解一下代码块的概念. class Test{ public static String str1; //静态字段 public String str2; //普通字段 static{ //静态代码块 } { //构造代码块 } public Test() { //构造函数 } } 二. 创建子类对象时,对象的初始化顺序 1. 字段初始化.代码块和构造函数的执行顺序 我们先看代码和结果 public class CodeBlockTe

  • Java对象初始化顺序的使用

    单一类:(静态成员变量&静态初始化块)<(成员变量&初始化块)<构造函数 复制代码 代码如下: public class 对象初始化顺序 {    public static void main(String[] args){        Person p = new Person();    }}class Person{    public static String staticfield ="静态成员变量";    public String fi

  • 详解Java字节码编程之非常好用的javassist

    一.Javassist入门 (一)Javassist是什么 Javassist是可以动态编辑Java字节码的类库.它可以在Java程序运行时定义一个新的类,并加载到JVM中:还可以在JVM加载时修改一个类文件.Javassist使用户不必关心字节码相关的规范也是可以编辑类文件的. (二)Javassist核心API 在Javassist中每个需要编辑的class都对应一个CtCLass实例,CtClass的含义是编译时的类(compile time class),这些类会存储在Class Poo

  • 学会Java字节码指令,成为技术大佬

    目录 01.加载与存储指令 1)将局部变量表中的变量压入操作数栈中 2)将常量池中的常量压入操作数栈中 3)将栈顶的数据出栈并装入局部变量表中 02.算术指令 1)创建指令 2)字段访问指令 1)比较指令 2)条件跳转指令 3)比较条件转指令 4)多条件分支跳转指令 5)无条件跳转指令 Java 官方的虚拟机 Hotspot 是基于栈的,而不是基于寄存器的. 基于栈的优点是可移植性更好.指令更短.实现起来简单,但不能随机访问栈中的元素,完成相同功能所需要的指令数也比寄存器的要多,需要频繁的入栈和

  • Javassist如何操作Java 字节码

    一.开篇 说起 AOP 小伙伴们肯定很熟悉,无论是 JDK 动态代理或者是 CGLIB 等,其底层都是通过操作 Java 字节码来实现代理.常用的一些操作字节码的技术有 ASM.AspectJ.Javassist 等. ASM 其设计和实现是尽可能小而且快,更专注于性能.它在指令的层面来操作,所以使用它需要对 JVM 的指令有所了解,门槛较高,CGLIB 就使用了 ASM 技术. AspectJ 扩展了 Java 语言,定义了一系列 AOP 语法,在 JVM 中运行需要使用特定的编译器生成遵守

  • Java字节码中jvm实例用法

    要想使Java运行,我们可以设计一个面向Java语言特性的虚拟机,并通过编译器将Java程序转换为它可以识别的指令序列,也称为Java字节码.由于Java字节码指令的操作码被固定为一个字节,所以它的名字就这样命名了.本篇要带来的是Java字节码中jvm的使用,主要分为两个操作视角,一起来看看具体内容吧. 1.虚拟机视角 在执行Java代码时,首先需要将编译后的class文件装入Java虚拟机.装入的Java类将存储在方法区(MethodArea)中.虚拟机会在实际运行时执行方法区内的代码.Jav

  • Java字节码增强技术知识点详解

    简单介绍下几种java字节码增强技术. ASM ASM是一个Java字节码操控框架,它能被用来动态生成类或者增强既有类的功能.ASM可以直接产生class文件,也可以在类被加载入Java虚拟机之前动态改变类行为.ASM从类文件中读入信息后,能够改变类行为,分析类信息,甚至能够根据用户要求生成新类. 主页:https://asm.ow2.io/index.html ASM框架中的核心类有以下几个: ① ClassReader:该类用来解析编译过的class字节码文件. ② ClassWriter:

  • Java字节码的增强技术

    目录 Java字节码的增强技术 一.简单介绍下几种java字节码增强技术 1.ASM 2.Javassist 3.Byte Buddy 4.JVM-SANDBOX Java字节码的增强技术 一.简单介绍下几种java字节码增强技术 1.ASM ASM是一个Java字节码操控框架,它能被用来动态生成类或者增强既有类的功能.ASM可以直接产生class文件,也可以在类被加载入Java虚拟机之前动态改变类行为.ASM从类文件中读入信息后,能够改变类行为,分析类信息,甚至能够根据用户要求生成新类. AS

随机推荐