java类加载

类的生命周期(类加载过程)

LLIUU+VPR

加载(Loading)

链接(Linking)

验证(Verification)

准备(Preparation)

解析(Resolution)

初始化(Initialization)

使用(Using)

卸载(Unloading) 类

类加载器种类

BootstrapClassLoader:C++编写,负责加载java核心类库

Launcher.ExtClassLoader:Launcher中的内部类,parent == null

Launcher.AppClassLoader:Launcher中的内部类,parent == ExtClassLoader

用户自定义ClassLoader:继承自ClassLoader,parent == AppClassLoader

类加载机制

java中默认的类加载机制是双亲委派模式。

ClassLoader中关键的方法说明:

loadClass // 类加载入口,包含下面这些步骤

=> findLoadedClass => findLoadedClass0 // 先从缓存中查询一下,看看目标类是否已加载过

=> findBootstrapClassOrNull => findBootstrapClass // 用Bootstrap类加载器进行加载

=> findClass // 读取字节码文件,然后加载字节码文件

=> defineClass // 加载字节码文件

=> preDefineClass // 加载前的检查

=> defineClassSourceLocation // 定义类加载的路径

=> defineClass1/defineClass2 // 调用native方法加载类

=> postDefineClass //

=> resolveClass => resolveClass0

ClassLoader 部分源码:

package java.lang;

import java.io.InputStream;

...

public abstract class ClassLoader {

private final ClassLoader parent;

// -- Class --

protected Class> loadClass(String name, boolean resolve)

throws ClassNotFoundException

{

synchronized (getClassLoadingLock(name)) {

// First, check if the class has already been loaded

Class> c = findLoadedClass(name); // 缓存机制

if (c == null) {

long t0 = System.nanoTime();

try {

// 双亲委派机制

if (parent != null) {

c = parent.loadClass(name, false);

} else {

c = findBootstrapClassOrNull(name);

}

} catch (ClassNotFoundException e) {

// ClassNotFoundException thrown if class not found

// from the non-null parent class loader

}

if (c == null) {

// If still not found, then invoke findClass in order

// to find the class.

long t1 = System.nanoTime();

c = findClass(name);

// this is the defining class loader; record the stats

sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);

sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);

sun.misc.PerfCounter.getFindClasses().increment();

}

}

if (resolve) {

resolveClass(c);

}

return c;

}

}

// findClass由子类去实现

protected Class> findClass(String name) throws ClassNotFoundException {

throw new ClassNotFoundException(name);

}

// defineClass 加载类

protected final Class> defineClass(String name, byte[] b, int off, int len,

ProtectionDomain protectionDomain)

throws ClassFormatError

{

protectionDomain = preDefineClass(name, protectionDomain);

String source = defineClassSourceLocation(protectionDomain);

Class> c = defineClass1(name, b, off, len, protectionDomain, source);

postDefineClass(c, protectionDomain);

return c;

}

private ProtectionDomain preDefineClass(String name,

ProtectionDomain pd)

{

if (!checkName(name))

throw new NoClassDefFoundError("IllegalName: " + name);

// Note: Checking logic in java.lang.invoke.MemberName.checkForTypeAlias

// relies on the fact that spoofing is impossible if a class has a name

// of the form "java.*"

if ((name != null) && name.startsWith("java.")) {

throw new SecurityException

("Prohibited package name: " +

name.substring(0, name.lastIndexOf('.')));

}

if (pd == null) {

pd = defaultDomain;

}

if (name != null) checkCerts(name, pd.getCodeSource());

return pd;

}

private String defineClassSourceLocation(ProtectionDomain pd)

{

CodeSource cs = pd.getCodeSource();

String source = null;

if (cs != null && cs.getLocation() != null) {

source = cs.getLocation().toString();

}

return source;

}

private void postDefineClass(Class> c, ProtectionDomain pd)

{

if (pd.getCodeSource() != null) {

Certificate certs[] = pd.getCodeSource().getCertificates();

if (certs != null)

setSigners(c, certs);

}

}

private native Class> defineClass0(String name, byte[] b, int off, int len,

ProtectionDomain pd);

private native Class> defineClass1(String name, byte[] b, int off, int len,

ProtectionDomain pd, String source);

private native Class> defineClass2(String name, java.nio.ByteBuffer b,

int off, int len, ProtectionDomain pd,

String source);

protected final void resolveClass(Class> c) {

resolveClass0(c);

}

private native void resolveClass0(Class> c);

private Class> findBootstrapClassOrNull(String name) {

if (!checkName(name)) return null;

return findBootstrapClass(name);

}

// return null if not found

private native Class> findBootstrapClass(String name);

protected final Class> findLoadedClass(String name) {

if (!checkName(name))

return null;

return findLoadedClass0(name);

}

private native final Class> findLoadedClass0(String name);

// -- Resource --

...

// -- Hierarchy --

...

// -- Package --

...

// -- Native library access --

...

// -- Assertion management --

...

}

双亲委派

java jdk 类加载机制_JDK源码阅读之类加载相关推荐

  1. JVM类加载机制(ClassLoader)源码解析

    http://blog.csdn.net/chenyi8888/article/details/7066569 其实JVM类加载机制,简单地说就是类管理,也就是我们生成的class文件. 三个步骤:装 ...

  2. 深度分析Java的ClassLoader机制(源码级别)

    转载自 深度分析Java的ClassLoader机制(源码级别) Java中的所有类,必须被装载到jvm中才能运行,这个装载工作是由jvm中的类装载器完成的,类装载器所做的工作实质是把类文件从硬盘读取 ...

  3. java io中断_JDK源码阅读:InterruptibleChannel 与可中断 IO

    来源:木杉的博客 , imushan.com/2018/08/01/java/language/JDK源码阅读-InterruptibleChannel与可中断IO/ Java传统IO是不支持中断的, ...

  4. java collection源码_jdk源码阅读Collection实例分析

    jdk源码阅读Collection详解 见过一句夸张的话,叫做"没有阅读过jdk源码的人不算学过java".从今天起开始精读源码.而适合精读的源码无非就是java.io,.util ...

  5. 深度分析 Java 的 ClassLoader 机制(源码级别)(转)

    写在前面:Java中的所有类,必须被装载到jvm中才能运行,这个装载工作是由jvm中的类装载器完成的,类装载器所做的工作实质是把类文件从硬盘读取到内存中,JVM在加载类的时候,都是通过ClassLoa ...

  6. java类验证和装载顺序_深度分析Java的ClassLoader机制(源码级别)

    原文地址:https://dwz.cn/AztGFkO7 作者:Hollis Java中的所有类,必须被装载到jvm中才能运行,这个装载工作是由jvm中的类装载器完成的,类装载器所做的工作实质是把类文 ...

  7. JVM类加载机制及源码分析

    JVM类加载机制 当我们运行某个类的main函数时,首先需要通过类加载器将主类加载到JVM中去. 类加载过程 加载 在硬盘上找到对应的.class文件,并且通过IO 读入 验证 校验字节码文件的正确性 ...

  8. Android消息机制 Looper源码阅读

    什么是Looper android源码上Looper类的注释为: 用于为线程运行消息循环的类,在默认情况下线程是没有与其关联的消息循环的;可以通过在线程中调用Looper.prepare()创建一个与 ...

  9. java常用类介绍及源码阅读(ArrayList)

    java.util  类 ArrayList<E> 继承关系: java.lang.Objectjava.util.AbstractCollection<E>java.util ...

最新文章

  1. linux 故障注入_阿里巴巴开源故障注入工具_chaosblade
  2. 【备忘1】防止表格/层 被撑破的CSS控制代码
  3. 别再蒸馏3层BERT了!变矮又能变瘦的DynaBERT了解一下
  4. android开发超级群(500人)
  5. 可真有你的!EasyEdge模型压缩新姿势……
  6. SHOI2016 黑暗前的幻想乡
  7. 在pandas中遍历DataFrame行
  8. php怎样使用pdo,PHP中使用PDO_PHP教程
  9. php全局化标签,PHP – 在整个应用程序中使类对象全局化?
  10. 解决win10的WiFi图标消失、win10打开或关闭系统图标网络灰色问题
  11. java long_Java long数据类型
  12. 15、孪生网络与相似度
  13. MDK5 添加Device
  14. 2020网易游戏测试面试二面面经(上海春招)
  15. 【一起学Rust | 设计模式】新类型模式
  16. 蜕变测试(metamorphic testing)经典论文阅读 Compiler Validation via Equivalence Modulo Inputs
  17. gcc参数-Wl,–gc-sections,不链接未用函数,减小可执行文件大小
  18. 自己动手写一个番茄小助手
  19. 微服务架构之全局异常(@ControllerAdvice + @ExceptionHandler)
  20. 如何做数据分析,数据分析流程是什么?

热门文章

  1. AIX-vi操作-提示Unknown terminal type的问题解决方法
  2. 数字阅读体验的平台距离我们还有多远?
  3. C#枚举、值、字符串的相互转换
  4. 金蝶系统服务器要求,金蝶服务器安装及其相关要求.doc
  5. eclipse集成maven插件
  6. C++11 —— 简易的旋转锁类
  7. ubuntu16.04 安装 ipython
  8. Freemarker模板引擎
  9. 2015 多校第三场
  10. headroom.js插件使用方法