Classloader 有3个作用

  • 将class加载到JVM中去
  • 审查每个类由谁去加载,是一种父优先的等级加载
  • 把Class字节码统一编译成JVM统一要求的对象格式

ClassLoader的等级加载机制

  • bootstrapClassloader :JVM自带的加载自己的工具,既没有更高一级的有没有子一级的加载器
  • ExtClassLoader : 主要是加载 System.getProperty("java.ext.dirs")目录下的内容,既不是纯正JVM内部也不是真正的外部类加载器。
  • AppClassLoader:他的父类就是ExtClassLoader 负责外部类加载,服务 System.getProperty("java.class.path")里面的内容,也就是我们所说的classpath目录

JVM加载class到内存中的两种方式

  • 显示加载:代码通过ClassLoader类来加载 调用loadClass()和getSystemClass;或者Class类的 Class.forName();又或者我们自己实现的findClass()方法
  • 隐式加载:如果我们在调用或者使用某个类时,不存在当前类内存是,JVM就自动去加载这个类

如何加载class文件

  • 第一步:首先找到这个class文件,然后class文件字节码 加载到JVM内存中。
    其实抽象类ClassLoader并没有定义如何去读取class文件,而是通过其子类URLClassLoader去实现他的findClass()方法,在URLCLassLoader中通过URLClassPath类的
帮助才能获取到class文件路径,然后在读取他的字节流,最有通过调用defineClass()来创建类。
  • 第二步:首先进行字节码验证、然后class数据结构分析、最后响应的内存分配和字符表连接。
  • 第三步:静态属性初始化和静态块的执行。

常见加载类的错误

  • ClassNotFoundException: 初学者在编写jdbc 加载驱动时,常用 Class.forName("指定的路径");的写法去加载一个类,这个方法通过指定的路径classpath路径下去找这个 类的路径,找不到就去检查路径。除了Class.forName()的方法,还有2中显示加载类的方式,一种是ClassLoader.loadClass()方法,另一种是ClassLoader.findSystemClass()方法。如果想要获取当前classpath的路径可以使用:this.getClass().getClassLoader().getResource("").toString()来获取;
  • ClassCastException:类型转换异常,这个很常见错误,解决和避免这个错误,有如下几个点:

    1、使用容器类时显示指出容器所包含的类型,如Map<String,Integer> map = new HashMap<String,Integer>()

    2、先通过instanceOf()方法检查是不是要转换的目标类型,然后再去进行强转。
  • NotCLassDefFoundError: 在JVM规范中,定义了出现该错误的原因是:使用new关键词、属性引用某个类、类继承了某个类实现某个接口、或者方法的参数里使用了某个类。这是会出发JVM隐式加载某个类找不到。解决办法是确认每个类都在classpath的路径下。
  • UnsatisfiedLinkError :这个错误可能是将某个JVM里的lib删掉了报的错。例如写了个JVM不错的library:System.loadLabriry("fuckKKK");就会报这个java.lang.UnsatisfiedLinkError.
  • ExceptionInIntializerError:JVM规范中指出,如果初始化器抛出了一些既不是Error也不是Exception的子类,就会创建一个ExceptionInIntializerError新实例,并用Exception 作为参数

Java Web 深入分析(5) Java ClassLoader 工作机制的更多相关文章

  1. 深入理解ClassLoader工作机制(jdk1.8)

    ClassLoader 顾名思义就是类加载器,ClassLoader 作用: 负责将 Class 加载到 JVM 中    审查每个类由谁加载(父优先的等级加载机制)    将 Class 字节码重新 ...

  2. Java web项目引用java项目,类型找不到

    Java web项目引用java项目,类型找不到 错误信息: java.lang.ClassNotFoundException: org.codehaus.jackson.map.ObjectMapp ...

  3. 理解ClassLoader工作机制

    package com.ioc; public class Test { public static void main(String[] args) throws ClassNotFoundExce ...

  4. Java Web项目与Java项目的区别

    一.以下是我对Java Web项目和Java项目这两者的理解以及区别: 1.Java Web项目是基于Java EE类的:而Java项目是基于Java应用程序的. 2.Java Web项目是网页的编码 ...

  5. Java Web 深入分析(11) JVM 体系结构与工作方式

    jvm体系 jvm简介 java virtual machine jvm体系详解 jvm工作机制 虚拟机怎么执行代码 jvm为何基于栈 执行引擎 执行引擎过程 java调用栈 总结

  6. Java web每天学之Servlet工作原理详情解析

    上篇文章中我们介绍了Servlet的实现方式以及Servlet的生命周期,我们这篇文章就来介绍一下常用对象. 点击回顾:<Java Web每天学之Servlet的工作原理解析>:<J ...

  7. Java Web 深入分析(4) Java IO 深入分析

    I/O问题可以说是现在海量数据时代下 ,I/O大部分web系统的瓶颈.我们要了解的java I/O(后面简称为(IO)) IO类库的基本结构 磁盘IO的工作机制 网络IO的工作机制 NIO的工作方式 ...

  8. Java Web 深入分析(6) Tomcat

    tomcat是什么:汤姆猫?Javaweb服务器? Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache ...

  9. Java Web 深入分析(11) JVM(1)

    前言 Java启动后作为一个进程运行在操作系统中,该进程要分配的内存有以下几个: 1.Java堆: 存储java内存区域,堆大小是在jvm启动时就像操作系统申请完成,其中 -Xmx和-Xms 分别表示 ...

  10. Java Web系列:Java Web 项目基础

    1.Java Web 模块结构 JSP文件和AXPX文件类似,路径和URL一一对应,都会被动态编译为单独class.Java Web和ASP.NET的核心是分别是Servlet和IHttpHandle ...

随机推荐

  1. 富文本编辑器handyeditor,上传和预览图片的host地址不一样

    使用富文本编辑器(官网)时,大多时候都会用到图片上传,但是下载的富文本编辑器的默认配置是只有一个上传地址的host的. var he = HE.getEditor('editor', { autoHe ...

  2. 真正解决方案:java.lang.NoClassDefFoundError: javax/xml/bind/DatatypeConverter

    今天在使用JDK 12.0 环境下使用Hibernate 时候出现了这个错误,错误日志如下: 故障原因: JAXB API是java EE 的API,因此在java SE 9.0 中不再包含这个 Ja ...

  3. final和finally和finalize的区别

    final 修饰类,不能被继承 修饰方法,不能被重写 修饰变量,只能赋值一次 finally 是try语句中的一个语句体,不能单独使用,用来释放资源 finalize 是一个方法,当垃圾回收器确定不存 ...

  4. ps 快捷键大全

    一.工具箱(多种工具共用一个快捷键的可同时按[Shift]加此快捷键选取)矩形.椭圆选框工具 [M]移动工具 [V]套索.多边形套索.磁性套索 [L]魔棒工具 [W]裁剪工具 [C]切片工具.切片选择 ...

  5. webpack概述——资源、样式、图片的打包工具

    官方地址:https://www.webpackjs.com/ Concepts At its core, webpack is a static module bundler for modern ...

  6. 阶段5 3.微服务项目【学成在线】_day09 课程预览 Eureka Feign_03-Eureka注册中心-搭建Eureka高可用环境

    1.3.2.2 高可用环境搭建 Eureka Server 高可用环境需要部署两个Eureka server,它们互相向对方注册.如果在本机启动两个Eureka需要 注意两个Eureka Server ...

  7. Node.js报错TypeError: Cannot read property 'isDirectory' of undefined

    截图如下: 原因如下:记住"./uploads" 后要加一个/ fs.stat("./uploads/" + files[i], function(err, s ...

  8. MySQL创建及删除临时表

    示例SQL: drop temporary table if exists testdb.tmp_test_table; create temporary table testdb.tmp_test_ ...

  9. 成为java架构师的技能

    0: 数据结构算法 数组.链表.堆.栈.队列.Hash表.二叉树等; 算法思想:递推.递归.穷举.贪心.分治.动态规划.迭代.分枝界限; 排序查找 B+/B-数.红黑树.图等; 图的深度优先搜索.图的 ...

  10. 【计算机视觉】Selective Search for Object Recognition论文阅读3

    Selective Search for Object Recoginition surgewong@gmail.com http://blog.csdn.net/surgewong       在前 ...