java字节码,异常部分分析

Posted soft.push("zzq")

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java字节码,异常部分分析相关的知识,希望对你有一定的参考价值。

public class Test {
    public void set(int i) {
        try {
            InputStream inputStream = new FileInputStream("abnc.txt");
            ServerSocket socketAddress = new ServerSocket(9999);
            socketAddress.accept();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
        }

    }
}

1 set方法在字节码层面默认会有两个参数,第一个参数是this这样能够保证我们调用实例对象的方法时候正常调用(可以理解成和一些解释类型的语言类似,只不过java在底层生成字节码隐式加上了this,对我们透明的)。

2 在set方法字节码显示局部变量有4个,this是一个,inputStream ,socketAddress ,还有另一个就是一旦出现异常时的变量e。

3 try cache在编译成字节码后,会将每条语句转换成jvm,16进制指令执行,针对指令解析后我们可以标记为注记符。针对于异常来说,java在字节码层面使用goto语句加上start_pc和end_pc以及handle_pc指令进行记录,从某一行开始到谋一行结束使用start_pc和end_pc进行标记,如果当前范围内出现异常则使用goto语句跳转到指定的catch位置。那么在cache位置后面紧跟着finally执行的语句,字节码层面每一个catch后面都会跟上一个finally,并不是java源代码层面看到的只有一个finally

ps:而且在这里提一句,在java源文件中如果有直接常量,类似于public  int a=16;  其实在底层字节码实际的赋值操作都是在构造方法内部完成的

以上是关于java字节码,异常部分分析的主要内容,如果未能解决你的问题,请参考以下文章

java如何生成字节码文件?

从JVM异常表和字节码角度分析try-catch-finally为什么效率低

字节码基于JavaAgent的全链路监控六 基于jvmti定位java异常信 息

通过字节码分析异常表的重要作用以及locals属性的含义

JVMday03类文件结构 字节码指令 多态的原理 异常 synchronized代码块底层原理

JVMday03类文件结构 字节码指令 多态的原理 异常 synchronized代码块底层原理