zoukankan      html  css  js  c++  java
  • java jvm 字节码 实例

    https://blog.csdn.net/wuzhiwei549/article/details/80626677

    代码

    package strings;
    //: strings/WhitherStringBuilder.java
    
    public class WhitherStringBuilder {
      public String implicit(String[] fields) {
        String result = "";
        for(int i = 0; i < fields.length; i++)
          result += fields[i];
        return result;
      }
      public String explicit(String[] fields) {
        StringBuilder result = new StringBuilder();
        for(int i = 0; i < fields.length; i++)
          result.append(fields[i]);
        return result.toString();
      }
    } ///:~

    生成的字节码如下

    public class strings.WhitherStringBuilder { 
      public strings.WhitherStringBuilder();
        Code:
           0: aload_0    // 将this引用推送至栈顶,即压入栈                
           1: invokespecial #8 //调用<init>方法实例化对象// Method java/lang/Object."<init>":()V
           4: return
    
      public java.lang.String implicit(java.lang.String[]);
        Code:
           0: ldc           #16 //将编号为#16的字符串推送至栈顶 // String
           2: astore_2     //将栈顶引用类型值存入第三个本地变量
           3: iconst_0      //将int型0推送至栈顶
           4: istore_3      //将栈顶int型数值存入第四个本地变量
           5: goto          32  //无条件跳转到32行
           8: new           #18  //新建一个StringBuilder对象编号#18,并将其引用压入栈顶// class java/lang/StringBuilder
          11: dup           //复制栈顶数值(在这里时引用)并将复制数值压入栈顶
          12: aload_2      //将第三个本地引用推送至栈顶
          13: invokestatic  #20//调用静态方法(这里调用了valueOf())// Method java/lang/String.valueOf:(Ljava/lang/Object;)Ljava/lang/String;
          16: invokespecial #26//调用超类构造方法,实例初始化方法,私有方法 // Method java/lang/StringBuilder."<init>":(Ljava/lang/String;)V
          19: aload_1       //将第二个引用本地变量(即数组引用)压入栈顶
          20: iload_3       //将第四个int本地变量压入栈顶
          21: aaload        //将引用数组指定索引的值推送至栈顶(即二个本地引用变量所代表的数组的下标为第四个int本地变量的值)
          22: invokevirtual #29//调用实例化方法append// Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
          25: invokevirtual #33 //调用实例化方法toString将结果转换为String// Method java/lang/StringBuilder.toString:()Ljava/lang/String;
          28: astore_2          //将栈顶引用类型值存入第三个本地变量
          29: iinc          3, 1 //将第4个int本地变量加1
          32: iload_3          //将第4个int本地变量推至栈顶
          33: aload_1          //将第二个引用类型本地办理推送至栈顶,第二个引用应该是改方法的参数的数组的引用
          34: arraylength      //获得数组的长度并压入栈顶 
          35: if_icmplt     8  //比较栈顶两int数值的大小如果小于0跳转到第8行
          38: aload_2          //将第二个本地引用类型的本地变量推送至栈顶
          39: areturn          //返回栈顶引用型本地变量,并退出方法
    
      public java.lang.String explicit(java.lang.String[]);
        Code:
           0: new           #18                 // class java/lang/StringBuilder
           3: dup
           4: invokespecial #45                 // Method java/lang/StringBuilder."<init>":()V
           7: astore_2
           8: iconst_0
           9: istore_3
          10: goto          24
          13: aload_2
          14: aload_1
          15: iload_3
          16: aaload
          17: invokevirtual #29                 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
          20: pop
          21: iinc          3, 1
          24: iload_3
          25: aload_1
          26: arraylength
          27: if_icmplt     13
          30: aload_2
          31: invokevirtual #33                 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
          34: areturn
    }
  • 相关阅读:
    ThreadLocal
    mysql查看和修改密码策略
    synchronized双重校验问题
    多线程下双重检查锁的问题及解决方法
    compiler explorer网站
    隐藏表格部分内容,开启宏自动显现
    powershell系列学习笔记二:变量
    强制用户启用宏
    poweshell系列学习笔记一:基础
    Cobalt Strike修改证书
  • 原文地址:https://www.cnblogs.com/jiangfeilong/p/10308310.html
Copyright © 2011-2022 走看看