Java基础之ClassLoader类加载器简介

classloader简介

1 classloader层次结构(父子关系)

Bootstrap(ClassLoader)

  • ExtClassLoader

    • AppClassLoader

      • XXXClassLoader

详见代码如下:

sun.misc.Launcher
public Launcher() {

        Launcher.ExtClassLoader var1;

        try {

            var1 = Launcher.ExtClassLoader.getExtClassLoader();

        } catch (IOException var10) {

            throw new InternalError("Could not create extension class loader", var10);

        }

        try {

            this.loader = Launcher.AppClassLoader.getAppClassLoader(var1);

        } catch (IOException var9) {

            throw new InternalError("Could not create application class loader", var9);

        }

2 classloader加载类过程

classloader在加载class时优先尝试通过parent classloader加载,如果加载不到,才尝试自己加载,即常说的“双亲委派”,

并且如果一个class依赖其他class,比如ClassA依赖ClassB,ClassB默认由ClassA的classloader来加载。

* <p> The methods and constructors of objects created by a class loader may
* reference other classes. To determine the class(es) referred to, the Java
* virtual machine invokes the {@link #loadClass <tt>loadClass</tt>} method of
* the class loader that originally created the class.

详见代码如下:

java.lang.ClassLoader
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;

        }

    }

原文地址:https://www.cnblogs.com/barneywill/p/10111633.html

时间: 2024-11-07 17:13:08

Java基础之ClassLoader类加载器简介的相关文章

Java基础知识之类加载器

1.类加载器定义 1.1类加载器概述: java类的加载是由虚拟机来完成的,虚拟机把描述类的Class文件加载到内存,并对数据进行校验,解析和初始化,最终形成能被java虚拟机直接使用的java类型,这就是虚拟机的类加载机制.JVM中用来完成上述功能的具体实现就是类加载器.类加载器读取.class字节码文件将其转换成java.lang.Class类的一个实例.每个实例用来表示一个java类.通过该实例的newInstance()方法可以创建出一个该类的对象. 1.2类的生命周期: 类从加载到虚拟

Java中对于ClassLoader类加载器 嵌套了深度技术的价值

关于Java技术是一种不断兴起的编程语言,对于ClassLoader 是 Java 届最为神秘的技术之一,无数人被它伤透了脑筋,摸不清门道究竟在哪里.本文我带你彻底吃透 ClassLoader,让你甚至Java类加载器的神奇之处  1.ClassLoader 做什么的? 顾名思义,它是用来加载 Class 的.它负责将 Class 的字节码形式转换成内存形式的 Class 对象.字节码可以来自于磁盘文件 *.class,也可以是 jar 包里的 *.class,也可以来自远程服务器提供的字节流,

【JAVAWEB学习笔记】25_基础加强:类加载器、注解 @xxx和动态代理

基础加强 学习目标 案例-自定义单元测试@MyTest 案例-全局的编码的解决 一.类加载器 1.什么是类加载器,作用是什么? 类加载器就加载字节码文件(.class) 2.类加载器的种类 类加载器有三种,不同类加载器加载不同的 1)BootStrap:引导类加载器:加载都是最基础的文件 2)ExtClassLoader:扩展类加载器:加载都是基础的文件 3)AppClassLoader:应用类加载器:三方jar包和自己编写java文件 怎么获得类加载器?(重点) ClassLoader 字节码

Java类加载器简介

类加载器是用于加载.class文件到虚拟机中,并生成java.lang.Class对象. 类加载器结构 jvm自带的类加载器有: bootstrap加载器 引导加载器又名根加载器,是女娲级别的加载器,rt.jar里的类都是由它加载的,如java.lang.Object.java.lang.String.java.lang.Class.java.lang.ClassLoader等等.没有它连Java都没法玩了,但它自己不是Java写的(要是Java写的就怪了,谁加载它啊?).因为不是Java对象,

java 反射,类的加载过程以及Classloader类加载器

首先自定义一个类Person package reflection; public class Person { private String name; public int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int a

Java魔法堂:类加载器入了个门

一.前言 <Java魔法堂:类加载机制入了个门>中提及整个类加载流程中只有加载阶段作为码农的我们可以入手干预,其余均由JVM处理.本文将记录加载阶段的核心组件——类加载器的相关信息,以便日后查阅.若有纰漏请大家指正,谢谢. 注意:以下内容基于JDK7和HotSpot VM. 二.类加载器种类及其关系 从上图可知Java主要有4种类加载器 1. Bootstrap ClassLoader(引导类加载器):作为JVM的一部分无法在应用程序中直接引用,由C/C++实现(其他JVM可能通过Java来实

ClassLoader类加载器

先看例子: public class ClassLoaderTest{     public static void main(String[] args) {         ClassLoader cl = ClassLoaderTest.class.getClassLoader();         System.out.println(cl);         System.out.println(cl.getParent());         System.out.println(c

深入理解java:1.1.类加载器

从java的动态性到类加载机制 我们知道,Java是一种动态语言. 那么怎样理解这个"动态"呢? 或者说一门语言具备了什么特性,才能称之为动态语言呢? 对于java,我是这样理解的. 我们都知道JVM(java虚拟机)执行的不是本地机器码指令, 而是执行一种称之为字节码的指令(存在于class文件中). 这就要求虚拟机在真正执行字节码之前,先把相关的class文件加载到内存中. 虚拟机不是一次性加载所有需要的class文件,因为它在执行的时候根本不会知道以后会用到哪些class文件.

java JVM-线程上下类加载器

public class One { public static void main(String[] args) throws Exception { ClassLoader loader=One.class.getClassLoader(); System.out.println(loader); //获得当前线程的上下文加载器,未改变前和第一种是一样的 ClassLoader loader2=Thread.currentThread().getContextClassLoader(); S