深入JVM字节码探索assert关键字

深入JVM字节码探索assert关键字

引言

如果熟悉 C 语言,那么也许会使用过assert.h中的assert函数,在 Java 中的assert关键字也能够提供运行时断言这一功能,不过不同之处在于,Java 的断言可以在运行中决定是否开启,因此不必重新编译字节码。

本文主要对assert这个关键字在 JVM 字节码层面的实现原理进行分析,讨论其运行时配置断言启用与禁用的方式。

目录

  1. assert关键字基础
  2. assert实现原理分析
  3. assert运行时配置启用与禁用

1. assert关键字基础

class Main {
   
    public static void main(String[] args) {
   
        assert null instanceof Object : "Hello, world!";
    }
}

用法很简单,只需要一个参数或者两个参数,在运行时检查第一个参数的值是否为true

这段程序直接运行不会输出任何内容,因为默认禁用断言,启用断言可以使用-ea选项。

$ javac Main.java
$ java -ea Main
Exception in thread "main" java.lang.AssertionError: Hello, world!
        at Main.main(Main.java:3)

2. assert实现原理分析

首先看一看上面这个类的字节码:

class Main {
   
  static final boolean $assertionsDisabled;

  Main();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: getstatic     #2                  // Field $assertionsDisabled:Z
       3: ifne          23
       6: aconst_null
       7: instanceof    #3                  // class java/lang/Object
      10: ifne          23
      13: new           #4                  // class java/lang/AssertionError
      16: dup
      17: ldc           #5                  // String Hello, world!
      19: invokespecial #6                  // Method java/lang/AssertionError."<init>":(Ljava/lang/Object;)V
      22: athrow
      23: 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值