400 028 6601

建站动态

根据您的个性需求进行定制 先人一步 抢占小程序红利时代

什么是JVM的类加载机制

这篇文章主要介绍“什么是JVM的类加载机制”,在日常操作中,相信很多人在什么是JVM的类加载机制问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”什么是JVM的类加载机制”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

创新互联建站是一家集网站建设,余杭企业网站建设,余杭品牌网站建设,网站定制,余杭网站建设报价,网络营销,网络优化,余杭网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。

JVM中类的生命周期包括7个阶段,加载、准备、验证、解析、初始化、使用、卸载。其中准备、验证、解析被归为连接阶段。什么是JVM的类加载机制

加载

jvm在这个阶段完成的工作

在这个阶段开发者可以控制二进制字节流的获取,也就是可以通过自定义的类加载器做自己定制化的操作。

验证

顾名思义,验证被加载的类的正确性。

准备

为类的 静态变量分配内存,并将其初始化为默认值

解析

把类中的符号引用转换为直接引用符号引用就是一组符号来描述目标(例如:ArrayList)。直接引用就是直接指向目标的指针、相对偏移量或一个间接定位到目标的句柄。

初始化

类变量的初始化

触发类初始化的场景

类加载器

双亲委派模型

image.png

双亲委派模型的实现,当一个类加载器需要加载类时,会把这个任务委派给父级类加载器,依次向上,倒顶层启动类加载器为止,如果父级无法加载,再自己处理加载。双亲委派模型的好处是,保证同一类环境中只有一个相同的类。也就是说JVM中判断是否是同一个类的条件是,是否相同的类加载器,类本身相同。代码示例:

public class ClassLoaderTest {
    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
        // 使用ClassLoaderTest的类加载器加载本类

        Object obj1 = ClassLoaderTest.class.getClassLoader().loadClass("com.ognice.ClassLoaderTest").newInstance();
        System.out.println(obj1.getClass().getClassLoader());
        System.out.println(obj1 instanceof ClassLoaderTest);

        // 使用自定义类加载器加载本类
        ClassLoader customClassLoader = new ClassLoader() {
            @Override
            public Class loadClass(String name) throws ClassNotFoundException {
                System.out.println("custom classloader loading " + name);
                String fileName = name.substring(name.lastIndexOf(".") + 1) + ".class";
                InputStream stream = getClass().getResourceAsStream(fileName);
                if (stream == null) {
                    return super.loadClass(name);
                }
                try {
                    byte[] b = new byte[stream.available()];
                    stream.read(b);
                    return defineClass(name, b, 0, b.length);
                } catch (IOException e) {
                    e.printStackTrace();
                }
                // 父级找class
                return super.loadClass(name);
            }
        };
        Object obj2 = customClassLoader.loadClass("com.ognice.ClassLoaderTest").newInstance();
        System.out.println(obj2.getClass().getClassLoader());
        System.out.println(obj2 instanceof ClassLoaderTest);
    }

}

执行结果

sun.misc.Launcher$AppClassLoader@18b4aac2
true
custom classloader loading com.ognice.ClassLoaderTest
custom classloader loading java.lang.Object
custom classloader loading java.lang.ClassLoader
custom classloader loading com.ognice.ClassLoaderTest$1
com.ognice.ClassLoaderTest$1@277c0f21
false

到此,关于“什么是JVM的类加载机制”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注创新互联网站,小编会继续努力为大家带来更多实用的文章!


分享题目:什么是JVM的类加载机制
标题链接:http://mzwzsj.com/article/iipchc.html

其他资讯

让你的专属顾问为你服务