数据结构论坛

首页 » 分类 » 常识 » 期Java类是如何被加载的
TUhjnbcbe - 2021/5/20 22:53:00
程少为讲白癜风 https://m-mip.39.net/baidianfeng/mipso_8498655.html
年百日百更原创Java最全面试题库之往期回顾

Java最全面试题库思维导图

JavaSE系列面试题汇总(共18篇)

JavaWeb系列面试题汇总(共10篇)

JavaEE系列面试题汇总(共13篇)

数据库系列面试题汇总(共6篇)

中间件系列面试题汇总(共3篇)

数据结构与算法面试题汇总(共11篇)

分布式面试题汇总(共10篇)

综合面试题系列汇总(共23篇)

Synchronized同步方法的八种使用场景

线上服务平均响应时间太长,怎么排查?

innodb下的记录锁,间隙锁,next-key锁

MySQL主从复制的几种方式

数据库实现缓存最终一致性的一些方法

SimpleDateFormat的线程安全问题与解决方案

单点登录的三种实现方式

SOA架构和微服务架构的区别

说说MySQL分区

线程池中多余的线程是如何回收的?

利用装饰者模式在不改变原有对象的基础上扩展功能

MySQL/InnoDB的加锁过程

反射是如何影响性能的,它到底慢在哪里?

分布式事务问题的几种方案

在项目中,如何应对高并发流量

HashMap面试二十一问!

方法重载和方法重写的原理

Spring是怎么解决循环依赖的?

JavaIO:字节流、字符流、缓冲流

网关gateway:限流10万QPS、跨域、过滤器、令牌桶算法

String长度有限制吗?是多少?

大数据量下的分页查询优化

如何设计一个Feed流系统

GET和POST请求的本质区别是什么?

如何处理重复请求/并发请求?

手写阻塞队列

如何设计一个秒杀系统

SQL编程思想:一切皆有关系

如何拆分复杂系统

如何设计统一API接口?

Elasticsearch查询数据的工作原理是什么?

MySQL主从复制的几种复制方式

为什么B+树更适合作为索引的结构以及索引原理

分布式锁,进程锁,线程锁的区别是什么?

线上系统高并发如何优化?

MyBatis如何查询千万级数据?

ZooKeeper的原理是什么?

分布式锁,进程锁,线程锁的区别是什么?

MySQL中的redolog,undolog,以及binlog的区别及各自作用是什么?

Java是如何实现线程间通信的?

API接口应该如何设计?如何保证安全?如何签名?如何防重?

一:前言

最近给一个非Java方向的朋友讲了下双亲委派模型,朋友让我写篇文章深度研究下JVM的ClassLoader,我确实也好久没写JVM相关的文章了,有点手痒痒,涂了皮炎平也抑制不住。

我在向朋友解释的时候是这么说的:双亲委派模型中,ClassLoader在加载类的时候,会先交由它的父ClassLoader加载,只有当父ClassLoader加载失败的情况下,才会尝试自己去加载。这样可以实现部分类的复用,又可以实现部分类的隔离,因为不同ClassLoader加载的类是互相隔离的。

不过贸然的向别人解释双亲委派模型是不妥的,如果在不了解JVM的类加载机制的情况下,又如何能很好的理解“不同ClassLoader加载的类是互相隔离的”这句话呢?所以为了理解双亲委派,最好的方式,就是先了解下ClassLoader的加载流程。

二:Java类是如何被加载的2.1:何时加载类

我们首先要清楚的是,Java类何时会被加载?

《深入理解Java虚拟机》给出的答案是:

遇到new、getstatic、putstatic等指令时。

对类进行反射调用的时候。

初始化某个类的子类的时候。

虚拟机启动时会先加载设置的程序主类。

使用JDK1.7的动态语言支持的时候。

其实要我说,最通俗易懂的答案就是:当运行过程中需要这个类的时候。

那么我们不妨就从如何加载类开始说起。

2.2:怎么加载类

利用ClassLoader加载类很简单,直接调用ClassLoder的loadClass()方法即可,我相信大家都会,但是还是要举个栗子:

publicclassTest{publicstaticvoidmain(String[]args)throwsClassNotFoundException{Test.class.getClassLoader().loadClass("

1
查看完整版本: 期Java类是如何被加载的