JVM學習筆記7:編譯期常量與運行期常量的區別及數組創建本質分析

對於數組實例來說,其類型是由JVM在運行期間動態生成的,表示爲[Lcom....
其父類型都是Object

助記符:
anewarray 表示將引用類型的(如類、接口、數組) 數組,並將其引用值壓入棧頂
newarray 表示將原始類型的(如int、float、char等) 數組,並將其引用值壓入棧頂
package com.shengsiyuan.jvm.classloder;
/*
     對於數組實例來說,其類型是由JVM在運行期間動態生成的,表示爲[Lcom....
     其父類型都是Object

     助記符:
     anewarray 表示將引用類型的(如類、接口、數組) 數組,並將其引用值壓入棧頂
     newarray 表示將原始類型的(如int、float、char等) 數組,並將其引用值壓入棧頂
 */
public class MyTest4 {
    public static void main(String[] args) {
        /*MyParent4 myParent4 = new MyParent4();//首次主動使用
        System.out.println("------");
        MyParent4 myParent5 = new MyParent4();
        //輸出的結果是 靜態代碼塊 ---- 沒了。因爲只有主動使用
        */
        MyParent4[] myParent4s=new MyParent4[1];//沒有任何輸出,並不是主動使用
        System.out.println(myParent4s.getClass());//class [Lcom.shengsiyuan.jvm.classloder.MyParent4;
        System.out.println(myParent4s.getClass().getSuperclass());//class java.lang.Object
        //這個是JVM在運行期生成出來的類型

        MyParent4[][] myParent4ss=new MyParent4[1][1];
        System.out.println(myParent4ss.getClass());//class [[Lcom.shengsiyuan.jvm.classloder.MyParent4;
        //會發現這次有兩個左括號
        System.out.println(myParent4ss.getClass().getSuperclass());//class java.lang.Object
        System.out.println("------");
        int[] ints=new int[1];
        System.out.println(ints.getClass());
        System.out.println(ints.getClass().getSuperclass());

        char[] chars=new char[1];
        System.out.println(chars.getClass());

        boolean[] booleans=new boolean[1];
        System.out.println(booleans.getClass());

        short[] shorts=new short[1];
        System.out.println(shorts.getClass());

        byte[] bytes=new byte[1];
        System.out.println(bytes.getClass());



    }
}
class MyParent4{
     static {
         System.out.println("Myparent4 static block");
     }
}

輸出的結果爲:

20:08:13: Executing task 'MyTest4.main()'...

> Task :compileJava
> Task :processResources NO-SOURCE
> Task :classes

> Task :MyTest4.main()
class [Lcom.shengsiyuan.jvm.classloder.MyParent4;
class java.lang.Object
class [[Lcom.shengsiyuan.jvm.classloder.MyParent4;
class java.lang.Object
------
class [I
class java.lang.Object
class [C
class [Z
class [S
class [B

BUILD SUCCESSFUL in 0s
2 actionable tasks: 2 executed
20:08:14: Task execution finished 'MyTest4.main()'.

對其進行追蹤結果爲:

D:\learning\jvm_lecture\build\classes\java\main\com\shengsiyuan\jvm\classloder>javap -c MyTest4
警告: 二進制文件MyTest4包含com.shengsiyuan.jvm.classloder.MyTest4
Compiled from "MyTest4.java"
public class com.shengsiyuan.jvm.classloder.MyTest4 {
  public com.shengsiyuan.jvm.classloder.MyTest4();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: iconst_1
       1: anewarray     #2                  // class com/shengsiyuan/jvm/classloder/MyParent4
       4: astore_1
       5: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
       8: aload_1
       9: invokevirtual #4                  // Method java/lang/Object.getClass:()Ljava/lang/Class;
      12: invokevirtual #5                  // Method java/io/PrintStream.println:(Ljava/lang/Object;)V
      15: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
      18: aload_1
      19: invokevirtual #4                  // Method java/lang/Object.getClass:()Ljava/lang/Class;
      22: invokevirtual #6                  // Method java/lang/Class.getSuperclass:()Ljava/lang/Class;
      25: invokevirtual #5                  // Method java/io/PrintStream.println:(Ljava/lang/Object;)V
      28: iconst_1
      29: iconst_1
      30: multianewarray #7,  2             // class "[[Lcom/shengsiyuan/jvm/classloder/MyParent4;"
      34: astore_2
      35: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
      38: aload_2
      39: invokevirtual #4                  // Method java/lang/Object.getClass:()Ljava/lang/Class;
      42: invokevirtual #5                  // Method java/io/PrintStream.println:(Ljava/lang/Object;)V
      45: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
      48: aload_2
      49: invokevirtual #4                  // Method java/lang/Object.getClass:()Ljava/lang/Class;
      52: invokevirtual #6                  // Method java/lang/Class.getSuperclass:()Ljava/lang/Class;
      55: invokevirtual #5                  // Method java/io/PrintStream.println:(Ljava/lang/Object;)V
      58: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
      61: ldc           #8                  // String ------
      63: invokevirtual #9                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
      66: iconst_1
      67: newarray       int
      69: astore_3
      70: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
      73: aload_3
      74: invokevirtual #4                  // Method java/lang/Object.getClass:()Ljava/lang/Class;
      77: invokevirtual #5                  // Method java/io/PrintStream.println:(Ljava/lang/Object;)V
      80: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
      83: aload_3
      84: invokevirtual #4                  // Method java/lang/Object.getClass:()Ljava/lang/Class;
      87: invokevirtual #6                  // Method java/lang/Class.getSuperclass:()Ljava/lang/Class;
      90: invokevirtual #5                  // Method java/io/PrintStream.println:(Ljava/lang/Object;)V
      93: iconst_1
      94: newarray       char
      96: astore        4
      98: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
     101: aload         4
     103: invokevirtual #4                  // Method java/lang/Object.getClass:()Ljava/lang/Class;
     106: invokevirtual #5                  // Method java/io/PrintStream.println:(Ljava/lang/Object;)V
     109: iconst_1
     110: newarray       boolean
     112: astore        5
     114: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
     117: aload         5
     119: invokevirtual #4                  // Method java/lang/Object.getClass:()Ljava/lang/Class;
     122: invokevirtual #5                  // Method java/io/PrintStream.println:(Ljava/lang/Object;)V
     125: iconst_1
     126: newarray       short
     128: astore        6
     130: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
     133: aload         6
     135: invokevirtual #4                  // Method java/lang/Object.getClass:()Ljava/lang/Class;
     138: invokevirtual #5                  // Method java/io/PrintStream.println:(Ljava/lang/Object;)V
     141: iconst_1
     142: newarray       byte
     144: astore        7
     146: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
     149: aload         7
     151: invokevirtual #4                  // Method java/lang/Object.getClass:()Ljava/lang/Class;
     154: invokevirtual #5                  // Method java/io/PrintStream.println:(Ljava/lang/Object;)V
     157: return
}

 

記得跟蹤一定是在classloder的目錄下進行的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章