JVM学习笔记day3

package com.ginger;

/**
 * @author ginger
 * @date 2019/11/14 9:38
 */
public class Test6 {
    public static void main(String[] args) throws Exception{
        Class clazz = Class.forName("java.lang.String");
        ClassLoader cl = clazz.getClassLoader();
        System.out.println(cl);
    }
}

运行结果:
在这里插入图片描述
此时返回的类加载器为null,说明String是由根类加载器加载的

package com.ginger;

/**
 * @author ginger
 * @date 2019/11/14 9:38
 */
public class Test6 {
    public static void main(String[] args) throws Exception{
        Class clazz = Class.forName("java.lang.String");
        ClassLoader cl1 = clazz.getClassLoader();
        System.out.println(cl1);
        Class clazz2 = Class.forName("com.ginger.C");
        ClassLoader cl2 = clazz2.getClassLoader();
        System.out.println(cl2);
    }
}
class C{

}

运行结果:
在这里插入图片描述
此时类C的类加载器为:sun.misc.Launcher$AppClassLoader@73d16e93
$符分隔内部类与外部类,此时外部类为sun.misc.Launcher,内部类为AppClassLoader(系统类加载器)此时真正加载类C的是AppClassLoader

package com.ginger;

/**
 * @author ginger
 * @date 2019/11/14 10:47
 */
public class Test7 {
    public static void main(String[] args) {
        System.out.println(Child.num);
    }

}
class Parent{
    static{
        System.out.println("Parent static block");
    }
    public static int num = 3;
    public static void doSomething(){
        System.out.println("Parent do something");
    }
}
class Child extends Parent{
    static {
        System.out.println("Child static block");
    }

}

输出结果:
在这里插入图片描述
说明子类并未被初始化,因为实际主动使用的还是父类

package com.ginger;

/**
 * @author ginger
 * @date 2019/11/14 11:07
 */
public class Test8 {
    public static void main(String[] args) throws Exception{
        ClassLoader cl = ClassLoader.getSystemClassLoader();
        Class clazz = cl.loadClass("com.ginger.simpleClass");
        System.out.println(clazz);
        System.out.println("----------------");
        clazz = Class.forName("com.ginger.simpleClass");
        System.out.println(clazz);
    }
}
class simpleClass{
    static{
        System.out.println("simpleClass static block");
    }
}

运行结果:
在这里插入图片描述
同样是加载一个类,用classload方法不是对类的主动使用就不会导致要加载的类进行初始化
而forName属于对类的主动使用,会将要加载的类进行初始化

获得当前类的ClassLoader
class.getClassLoader();
获得当前线程上下文的ClassLoader
Thread.currentThread().getContextClassLoader()
获得调用者的ClassLoader
DriverManager.getCallerClassLoader()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值