类加载:类加载器、双亲委派机制、tomcat打破双亲委派、类加载顺序

触发时机

main方法,需要用到类的时候才加载(new等,申明变量不加载),如果类未加载则加载类。

加载流程

Launcher类获取类加载器,双亲委派机制,加载类。

1、类加载器

类加载器是单例模式,用两个判断和synchronize来保证单例。

        /**
         * create an ExtClassLoader. The ExtClassLoader is created
         * within a context that limits which files it can read
         */
        public static ExtClassLoader getExtClassLoader() throws IOException
        {
            if (instance == null) {
                synchronized(ExtClassLoader.class) {
                    if (instance == null) {
                        instance = createExtClassLoader();
                    }
                }
            }
            return instance;
        }

3种类加载器:

BootstrapClassLoader。加载位于JRE的lib目录下的核心类库。

ExtClassLoader。加载位于JRE的lib目录下的ext扩展jar包。

AppClassLoader。加载我们自己写的项目ClassPath路径下的类包。

2、双亲委派

类加载器加载时,先向上委派,上面不行再走自己的。核心方法loadClass

5ecef31b081f4a2a8f3d46267e907a43.png89918d3b0b374b8aad73ee79264774dc.pngfd26791a1cd54f4d84c890ad8f129bd2.png

原因:

沙箱安全:避免自己写的类覆盖核心java类

单一:避免重复加载类

打破双亲委派tomcat:

双亲委派缺点:

一个类只有一个版本,因为是根据名称获取。tomcat中不同web针对同一个类需要不同版本。

如何打破?自定义类加载器extend ClassLoader,复写findClass方法。

------------------------------------插播其他小知识----------------------------------

可执行jar包的入口是META-INFO/MANIFEST.MF的main-class。如果没有main-class,这这个可能不是个可执行的jar,是个插件或库。

------------------------------------回到正题----------------------------------

3、加载类

加载:把类放入方法区。磁盘中.class文件到内存中

验证:验证是class文件是否正确

准备:设置静态字段的内存大小

解析:符号引用变为直接引用(静态链接)

初始化:静态字段初始化值,执行静态代码块

 

  • 14
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值