對於數組實例來說,其類型是由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的目錄下進行的