在我们日常的项目开发中,会经常碰到ClassNotFoundException和NoClassDefFoundError这两种异常,对于经验足够的工程师而言,可能很轻松的就可以解决,但是却不一定明白为何要去这么做,本博客将从java虚拟机类加载的角度让大家彻底理解ClassNotFoundException和NoClassDefFoundError这两种异常及一些重用的解决方案. 在博客中我们已经讲解过,程序员定义的java类要被java虚拟机运行首先要做的就是类加载过程,而类加载过程的第一步就…
从 1 开始学 JVM 系列 类加载器,对于很多人来说并不陌生.我自己第一次听到这个概念时觉得有点"高大上",觉得只有深入 JDK 源码才会触碰到 ClassLoader,平时都是传闻中的东西. 今天,就让我们一起来探索一下这"传闻"中的类加载器,看看它是何方神圣. 类生命周期 在正式聊类加载器之前,我们先正本清源,看看类的生命周期是什么样的. 为了方便后续解读,下面我贴了一张图展示了类的生命周期的 7 个步骤. 对于前 5 步,简单来说就是加载.链接.初始化,这是…
一.创建Sample 1.创建实例 public class MyPerson { private MyPerson myPerson; public void setMyPerson(Object obj){ this.myPerson = (MyPerson)obj; } } 2.创建测试类 public class MyTest20 { public static void main(String[] args) throws Exception { MyTest16 loader1 =…
1.类加载流程图 从磁盘加载到销毁的完整过程. 2.类加载流程图2 1.加载: 就是把二进制形式的java类型读入java虚拟机中 2.连接: 验证.准备.解析. 连接就是将已经读入到内存的类的二进制数据和合并到虚拟机的运行时环境中 验证: 类文件的结构检查 语义检查 字节码验证 二进制兼容性验证 准备: 为类分配内存,设置默认值.但是在到达初始化之前,类变量都没有初始化为真正的初始值. 解析:解析过程就是在类型的常量池中寻找类.接口.字段和方法的符号引用,把这些符号引用替换为直接引用的过程.…
类加载 在Java代码中,类型的加载.连接与初始化过程都是在程序运行期间完成的. 类型可以是Class,Interface, 枚举等. Java虚拟机与程序的生命周期 在如下几种情况下,Java虚拟机将结束生命周期 1)执行了System.exit() 方法 2)程序正常执行结束 3)程序在执行过程中遇到了异常或者错误而异常终止. 4) 由于操作系统出现错误导致Java虚拟机进程终止. 1.JVM运行流程,JVM基本结构 2.类加载器双亲委派模型 3.ClassLoader源码解析 4.从源码分…
一.Java虚拟机启动.加载类过程分析 下面我将定义一个非常简单的java程序并运行它,来逐步分析java虚拟机启动的过程. package org.luanlouis.jvm.load; import sun.security.pkcs11.P11Util; /** * Created by louis on 2016/1/16. */ public class Main{ public static void main(String[] args) { System.out.println(…
1,ClassLoader类加载器简介 在Java里面提供一个系统的环境变量:ClassPath,这个属性的作用主要是在JVM进程启动的时候进行类加载路径的定义,在JVM里面可以根据类加载器而后进行指定路径中类的加载,也就是说找到了类的加载器就意味着找到了类的来源. 系统类的加载器 如果说现在要想获得类的加载器,那么一定要通过ClassLoader来获取,而要想获取ClassLoader类的对象,则必须利用class类[反射的根源]实现,方法:public ClassLoader getClas…
先来一道题,试试水平 public static void main(String[] args) { ClassLoader c1 = ClassloaderStudy.class.getClassLoader(); ClassLoader c1Parent = ClassloaderStudy.class.getClassLoader().getParent(); ClassLoader c1ParentParent = ClassloaderStudy.class.getClassLoad…
Java安全之 ClassLoader类加载器 0x00 前言 前面这里抛出一个问题,Java到底是什么类型的编程语言?是编译型?还是解释型?在这个问题是其实一直都都有疑惑,如果说是解释型语言的话,那么为什么需要编译呢?如果说是编译型语言的话,那么在编译完成后,需要JVM去解析才能运行呢?其实两种说法都对,也不对.下面来看看java的一个执行流程就知道是怎么回事了. 0x01 类加载机制 Java中的源码.java后缀文件会在运行前被编译成.class后缀文件,Java类初始化的时候会调用jav…
类加载器的分类 JVM支持两种类型的类加载器,分别为引导类加载器(Bootstrap ClassLoader)和自定义类加载器(User-Defined ClassLoader). 从概念上来讲,自定义类加载器一般指的是程序中由开发人员自定义的一类类加载器,但是java虚拟机规范却没有这么定义,而是将所有派生于抽象类ClassLoader的类加载器都划分为自定义类加载器. 无论怎么划分,我们最常见的类加载器始终只有三种: 虚拟机自带的加载器 启动类加载器(引导类加载器 Bootstrap Cla…