`

关于java class loader的理解笔记

阅读更多

JAVA中的一切都是以类的形式存在的(除少数底层的东西,那些我就不清楚是怎么回事了)。我们运行的接口是一个类,运行中所涉及到的对象也都是类对象。下面,我们来研究下,我所理解的类的加载机制。

比如我们有一个Student类,也就是经过编译后,是一个Student.class文件。当我们的程序运行的过程中,第一次实例化一个student对象的时候,系统首先要做的就是加载Student这个类。也就是把Student.class以字节玛的形势加载到内存中(并通过defineClass()这个方法转变成Class对象,最终以Class对象的形式存储在内存中)。这个加载的过程就是由类加载器来完成的。

一般的,在程序启动之后,系统会主要会有三个类加载器:Bootstrap Loader、ExtClassLoader与AppClassLoader。

Bootstrap Loader是由C++撰写的,它主要负责搜索JRE所在目录的classes或lib目录下的.jar文件(例如rt.jar)是否需要被加载(实际上是由系统参数sun.boot.class.path来指定);ExtClassLoader主要负责搜索JRE所在目录的lib/ext 目录下的classes或.jar中是否需要被加载(实际上是由系统参数java.ext.dirs指定);AppClassLoader则是搜索 Classpath中是否有指定的classes需要被载入(由系统参数java.class.path指定)。

简单的说,Bootstrap Loader、ExtClassLoader这两个类加载器,主要是加载系统类库里的类。我们自己编辑的类一般都是由AppClassLoader来加载。当我们遇到如下代码的时候:

Student stu  = new Student();
//实例化一个Student类的对象stu

AppClassLoader首先会到classpath下去寻找Student.class文件。(找不到则会抛出ClassNotFoundException异常)找到之后便会把Student这个类以二进制的形式存储到内存中。这个过程也就是对Student类加载的过程。然后用我们加载到内存中的Student类去实例化一个Student对象stu。

以上就是所谓的隐式的类的加载过程。但是有些时候需要我们自定义一个类的加载器,这个时候就需要我们模仿这个过程,显示的加载我们自己所需要的类。比如,我们自定义一个类的加载器MyClassLoader,那我们利用我们自定义的这个加载器,显示的去加载一个类的过程也是这样的:

1.寻找类文件。
这里的灵活性比较大,我们可以自己去设计如何去寻找类文件以及去哪里寻找类文件。比如一些非本地的类文件,通过系统的类加载器无法加载到这些类,这个时候,我们就可以利用自定义的类加载器指定路径去寻找。
2.加载类文件。
找到我们所要加载的类之后,通过MyClassLoader的defineClass()方法,把这个类加载到指定的内存中。这里我们可以自己设定存储类的内存空间,比如把我们加载的类都统一放到一个变量数组里(至于系统的类加载到内存中是以什么样的形式存储再内存中的,我还不清楚,只知道是以二进制的形式保存的,可以用一个Class对象去引用)。
3.创建类对象。
我接触的时候还不大理解,其实这里是应用我们自己加载到内存中的类,去实例化一个对象。以下代码可以参考:

import java.net.MalformedURLException;
import java.net.URL;

class MyClassLoader {
    
public static void main(String[] args) throws MalformedURLException,
            ClassNotFoundException 
{
        URL url1 
= new URL("file:/d:/workspace/");
        
// 指定路径,相当于classpath的意思。
        myClassLoader myClassLoader = new MyClassLoader(new URL[] { url1 });
        
// 用这个路径创建一个myClassLoader对象。这里随你所定义的ClassLoader而定。
        Class c1 = myClassLoader.loadClass("Student");
        
// 用自定义的类加载器,去显式的加载一个类。返回一个Class对象。
        Student stu = c1.newInstance();
        
// 用这个Class对象就可以产生一个ClassLoaderTest的实例。
    }

}

正在学习中,理解的还不够准确。保持更新。
分享到:
评论

相关推荐

    毕向东Java笔记

    ### 毕向东Java笔记知识点总结 #### 第一章:编程基础 1. **Java的特性和优势**: - **简单性**:Java的设计哲学是“使编程变得简单”。 - **面向对象**:Java完全支持面向对象编程概念如封装、继承和多态。 - ...

    深入理解Java虚拟机笔记(带目录).docx

    深入理解 Java 虚拟机笔记 Java 虚拟机(JVM)是 Java 语言的运行环境,它负责解释和执行 Java 字节码。下面是 Java 虚拟机相关的知识点: 虚拟机内存结构 Java 虚拟机的内存结构主要包括以下几个部分: * 方法...

    《java程序设计习题集》读书笔记上册

    - 类加载器(Class Loader)负责将字节码文件加载到内存中。 - 字节码验证器(Bytecode Verifier)确保加载的字节码是合法且安全的。 - 解释器(Interpreter)读取经过验证的字节码,并将其转换为机器语言执行。 ...

    Java分布式应用学习笔记02再谈JVM

    ### Java分布式应用学习笔记02再谈JVM 在深入探讨Java虚拟机(JVM)时,我们再次聚焦于这个核心组件,它不仅是Java运行环境的心脏,也是构建分布式应用的关键技术之一。JVM作为Java语言的核心执行环境,其设计与...

    理解虚拟机--有笔记版

    在JVM的执行过程中,类加载器(Class Loader)负责将.class文件中的二进制数据读入内存中,将其转换为方法区内的运行时数据结构,并在堆中生成一个java.lang.Class对象,作为对方法区中数据的访问入口。类加载的过程...

    java反射与动态代理笔记

    - `Proxy.newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h)`:创建一个新的代理对象,实现给定的接口,并关联一个InvocationHandler。 2. **InvocationHandler接口**:处理代理...

    Java Instrumentation笔记

    ### Java Instrumentation 深入理解 #### 一、引言 Java Instrumentation 是 Java 平台的一个强大特性,允许开发者在不修改源代码的情况下,动态地修改正在运行的 Java 应用程序的行为。这一特性最早出现在 Java SE...

    安卓逆向学习笔记之使用frida改进FART.docx

    通常,`Class Loader`有两种类型:`Boot Class Loader`和`Path Class Loader`。`Boot Class Loader`用于加载系统框架类,而`Path Class Loader`则用于加载应用程序自身的类文件。 **1.2 FART的工作机制** - **获取...

    jvm笔记

    JVM 可以分为三个部分:CLASS LOADER、RUN TIME DATA AREA 和 EXECUTION ENGINE。CLASS LOADER 负责加载类文件,并将其转换成 JVM 可以识别的格式。RUN TIME DATA AREA 负责存储类加载后的数据,而 EXECUTION ENGINE...

    java7rt.jar源码-Java_JVM:这是我的JavaJVM学习笔记

    loader)创建一个初始类(Initial Class)来完成 2.执行 执行一个所谓的Java程序时,真正的执行的是一个叫做Java虚拟机的进程 3.退出 程序正常结束;程序遇到错误或异常时终止运行;Runtime或System类调用exit()方法...

    安卓逆向学习笔记之FART主动调用组件设计和源码分析.docx

    ### 安卓逆向学习笔记之FART主动调用组件设计和源码分析 #### 一、概述 本文档旨在探讨安卓逆向工程中的一个重要工具——FART(Find And Replace Tool),并着重介绍如何利用该工具进行主动调用组件的设计与源码...

    JDBC学习笔记总结,可以看看

    "JDBC学习笔记总结" JDBC(Java Database Connectivity)是一种Java API,用于连接和操作关系数据库。下面是JDBC学习笔记的总结: 连接到数据库的方法 1. ODBC(Open Database Connectivity):是一个以C语言为...

    OSGI学习笔记.doc

    与传统Java应用中所有类由单一Class Loader加载不同,OSGI为每个bundle提供了独立的Class Loader,这使得每个bundle可以有自己的类空间,并且支持按属性和版本进行类的过滤加载,增强了类的隔离性和版本管理。...

    环境变量配置及JVM虚拟机笔记

    - **类加载器(Class Loader)**:负责读取字节码文件,并将其加载到内存中。 - **运行时数据区(Runtime Data Area)**:包括方法区、堆、线程栈等。 - **执行引擎(Execution Engine)**:解释执行字节码指令。 - **本地...

    java9学习笔记之模块化详解

    ServiceLoader<IStudentService> loader = ServiceLoader.load(IStudentService.class); loader.forEach(service -> service.study()); } } ``` 总结来说,Java 9的模块化系统通过模块化的概念,帮助开发者更好...

    c#学习笔记.txt

    如前所述,我是一个狮子座男人,一度我认为学习Java会使我看起来与众不同,可是几个月以后我放弃了这个选择,我看了论坛里关于这两种语言孰优孰劣的讨论,最终选择了C#,请不要问我为何做出这样的选择,很多人认为...

    day021-反射和注解笔记和代码.rar

    Class 类的实例表示正在运行的 Java 应用程序中的类和接口; 枚举是一种类,注解(指的是注解Annotation)是一种接口; 每个数组都是 Class字节码类中的一个具体 对象 基本的 Java 类型(boolean、byte、...

    My oracle笔记

    2. 文件操作命令:Oracle提供了SQL*Loader用于批量导入数据,SQL*Plus的`SPOOL`命令可以将查询结果输出到文件。此外,`ALTER SYSTEM SET`用于修改系统参数,`CREATE PFILE FROM SPFILE`用于创建初始化参数文件副本。...

    Flex新手教程_入门级学习笔记

    ### Flex新手教程_入门级学习笔记 #### ActionScript核心概念 **ActionScript(简称AS)** 是一种面向对象的编程语言,主要用于开发Flex应用程序。掌握AS的基础知识对于学习Flex至关重要。 ##### 类和对象 (Class...

Global site tag (gtag.js) - Google Analytics