-XX:+TraceClassLoading,用于追踪类的加载信息并打印出来.
在ideaVMoption中配置: -XX:+TraceClassLoading,
运行主类,结果如下:
表示虚拟机,在当前类下,虚拟机加载类的信息
第一个为Object,代表加载Object类,所有类的父类.自己创建的类,首先加载main函数,代表该类主动使用.
JVM参数:
-XX:+<option>,表示开启option选项
-XX:-<option>:表示关闭option选项
-XX:<option>=<value>表示将option选项的值设置为value
编写MyTest2
package cn.zkun;
// final修饰的常量在编译阶段,
//会存入到调用这个常量方法所在类的常量池中.
//本质上,调用类并没有直接引用到定义常量的类,
//因此并不会触发定义常量的类的初始化,所以没有打印静态代码块.
//注意:这里指的是将常量存放到MyTest02的常量池中,之后MyTest02与//Myparent02就没有任何关系了.
//甚至,我们可以将MyParent2的class文件删除
public class MyTest02 {
public static void main(String[] args) {
//对Myparent2的主动使用
//在编译阶段 这个常量就会被存入到
//调用这个常量的方法所在的类的常量池中.
System.out.println(Myparent2.str);
}
}
class Myparent2 {
public static final String str = "hello world";
static {
System.out.println("Myparent2 static block");
}
}
str加上final之后,发现没有静态代码块打印了.这是为什么?
Final:代表修饰的字符是一个常量, 在编译阶段 这个常量就会被存入到
//调用这个常量的方法所在的类的常量池中.
-----------------------------------------------------
反编译查看文件内容
E:\XcEduCode01\ShuaTi\out\production\Map\cn\zkun>javap -c MyTest02
警告: 二进制文件MyTest02包含cn.zkun.MyTest02
Compiled from "MyTest02.java"
public class cn.zkun.MyTest02 {
public cn.zkun.MyTest02();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<i
nit>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: getstatic #2 // Field java/lang/System.out:
Ljava/io/PrintStream;
3: ldc #4 // String hello world
5: invokevirtual #5 // Method java/io/PrintStream.
println:(Ljava/lang/String;)V
8: return
}
解析: 3: ldc #4 // String hello world
该行代码已经成为hello world了
ldc:助记符,表示将int,float或是String类型的常量值
从常量池中推送到栈顶(接下来要用的值).
改变值为short,
反编译后的结果.
助记符变成bipush
bipush:表示将单字节(-128-127)的常量值推送至栈顶.
添加int变量的值,编译后反编译.
助记符变成sipush:
解释sipush:表示将一个短整型常量值(-32768-32767)推送至栈顶.
助记符变化成:iconst_1
表示将int类型1推送至栈顶(改成2,3,4,5)
助记符为iconst_2
iconst_3
iconst_4
iconst_5