Java类加载机制

Java类加载机制

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


一、什么是Java的类加载?

个人理解:我们在Java中创建新对象时,不能够凭空创建,必须有一个模板,这个模板就是我们的一个java.lang.Class对象,有了这个模板,我们就可以按照这个模板去创建新的对象。

这样就会产生下面几个问题:
1.谁来加载? ----->类加载器
2.什么时候加载? ----->当要用的时候,例如创建对象,同时又没有这个对象的Class对象时加载
3.加载到那里去?----->类中定义的static静态结构加载到方法区,这个Class对象加载到堆中。
4.怎么加载?---->加载----->链接---->初始化
例如我们写了一个Person.class类,现在我们要 Person p1=new Person()创建一个新的Person对象,这个任务会交给我们的类加载器,让他去完成创建一个新对象。
类加载器拿到这个任务后会先判断之前加载过这个对象没有,如果加载过了就不加载,因为模板一个就够了,如果没有加载,那就去加载这个对象。
1.加载:创建java.lang.Class对象
(1)先根据全限定类名,读如Person.class二进制文件
(2)将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。
(3)在堆中生成模板 Person.class对象,同时我们要能找到方法区的静态结构,也是这个对象提供了静态数据的接口。
2链接:虽然,我们有了一个模板,但是,这个模板有没有问题,能不能用呢?不知道!!!所以我们要去验证、准备、解析
(1)验证:我们需要先判断这个二进制文件是不是合法的,不合法就不加载。
(2)准备:为静态结构在方法区开辟内存,而且赋0值。
(3)解析:二进制文件中常量池部分是符号引用,把符号引用换成直接引用。
3初始化:
(1)上面给静态结构赋值0,现在给他们赋我们写的值。

这个时候我们就有了一个模板,根据这个模板我们就可以去创建我们的对象,为我们的对象分配内存,初始化对象其他成员变量的值。

二、类加载器

1.启动类加载器 C/C++实现

启动类加载器: BootstrapClassLoader,负责加载存放在 JDK\jre\lib(JDK代表JDK的安装目录,下同)下,或被 -Xbootclasspath参数指定的路径中的,并且能被虚拟机识别的类库(如rt.jar,所有的java.开头的类均被 BootstrapClassLoader加载)。启动类加载器是无法被Java程序直接引用的。

2.扩展类加载器

扩展类加载器: ExtensionClassLoader,该加载器由 sun.misc.Launcher$ExtClassLoader实现,它负责加载 JDK\jre\lib\ext目录中,或者由 java.ext.dirs系统变量指定的路径中的所有类库(如javax.开头的类),开发者可以直接使用扩展类加载器。

3.应用程序类加载器

应用程序类加载器: ApplicationClassLoader,该类加载器由 sun.misc.Launcher$AppClassLoader来实现,它负责加载用户类路径(ClassPath)所指定的类,开发者可以直接使用该类加载器,如果应用程序中没有自定义过自己的类加载器,一般情况下这个就是程序中默认的类加载器。

=====================================================

1.双亲委派机制/沙箱安全机制:

如果,我们自己定义了一个Java.lang.String的类,那我们新建一个String类,是我们的类还是系统自己的类:这个问题就是双亲委派机制去解决的:
(1)收到类加载请求,把请求交给父加载器执行
(2)父加载器还有父亲,继续上交
(3)父加载器能加载,就让父加载器加载,加载不了,才自己加载
这种方法:避免了类的重复加载
保证线程安全,避免核心API被篡改

2.两个类什么时候为同一个类:

1.包名类名相同
2.类加载器相同

总结

我们新建对象需要一个模板,没有模板时我们就去创建这个模板,加载:先找到他,模模糊糊建一个。链接:看他合不合法、给静态结构赋0值,换引用。初始化:给静态结构换上我们赋予的值

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值