对于数组实例来说,其类型是由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的目录下进行的