`
supben
  • 浏览: 329150 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

classloader

    博客分类:
  • JVM
 
阅读更多
Java中一共有四个类加载器,之所以叫类加载器,是程序要用到某个类的时候,要用类加载器载入内存。
    这四个类加载器分别为:Bootstrap ClassLoader、Extension ClassLoader、AppClassLoader和URLClassLoader,其中AppClassLoader在很多地方被叫做System ClassLoader。

Bootstrap ClassLoader是在JVM开始运行的时候加载java的核心类,是用C++编写的,它用来加载核心类库比如rt.jar,tools.jar等。
Extension ClassLoader是用来加载扩展类,即/lib/ext中的类。用的不多,比如dns,security什么的。
AppClassLoader用来加载Classpath的类,实际上我们还常用AppClassLoader来加载配置文件。spring可以用classpath做前缀,就是这个原理。
URLClassLoader用来加载网络上远程的类,不讨论。

按顺序是从大到小。 java 的class 加载采取委托模式:某个classloader 加载之前会先调用他上级来加载,只有上级找不到了,才会自己加载。这样做的第一个好处就是为了安全。比如,一定没有人能够伪造jre 标准类的java.lang.String。

载入class不等于new一个class。
在jdbc代码中有一句奇怪的。class.forName("xxxDriver");看驱动源码
public class Driver extends NonRegisteringDriver{ 

    public Driver() throws SQLException{} 

    static { 
        try{ 
            DriverManager.registerDriver(new Driver()); 
        } 
        catch(SQLException E){ 
            throw new RuntimeException("Can't register driver!"); 
        } 
    } 
} 


Driver 中只有一个静态的方法把自己注册到driverManager中。那么就完全没必要new一个他的实例。载入就好了。但是想想还是不对,driver不是在web Server起来的时候就载入了吗?

最终结论:class的static块,调用ClassLoader.loadClass是不会执行的。只有在调用forName(String)载入class时执行。static永远只会执行一次。想来web服务器装载类的时候都是用的loadClass方法吧。

注:如果需要指定classLoader,使用自定义的classLoder加载,比如tomcat下面挂10个应用,可以在各自的线程中通过setContextClassLoader方法绑定各自的classLoader。
另:servlet的加载方式违背了委托模式。
详见tomcat的类加载机制:
http://www.blogjava.net/tomjamescn/archive/2009/06/23/283670.html
分享到:
评论

相关推荐

    ClassLoader

    ### Java虚拟机中ClassLoader概述与双亲委托机制详解 #### 一、ClassLoader概念与作用 在Java编程语言中,`ClassLoader`是一个非常重要的组件,它负责加载程序运行所需的类文件到Java虚拟机(JVM)中。`ClassLoader`...

    ClassLoader运行机制 自己写的

    在Java虚拟机(JVM)中,类加载器(ClassLoader)是至关重要的组成部分,它负责查找和加载类的字节码文件。理解ClassLoader的工作机制对于深入掌握Java应用程序的运行至关重要。这里我们将详细讨论ClassLoader的运行...

    深入理解ClassLoader工作机制.docx

    《深入理解ClassLoader工作机制》 Java虚拟机(JVM)中的ClassLoader是负责加载类到内存中的核心组件。它不仅承担着将字节码转换为可执行对象的重任,还参与了类生命周期的各个阶段,包括加载、验证、准备、解析、...

    自定义classloader的使用

    在Java中,Classloader是加载类的关键组件,它负责查找、加载和初始化字节码文件。自定义Classloader允许开发者根据特定需求定制类的加载逻辑,例如加密类文件、隔离不同版本的库或者动态加载代码。本文将深入探讨...

    ClassLoader小例子

    在Java编程语言中,ClassLoader是一个至关重要的组成部分,它负责加载类到JVM(Java虚拟机)中,使得程序能够执行。本示例"ClassLoader小例子"将深入探讨这个概念,并通过一个具体的程序来演示其工作原理。下面我们...

    java ClassLoader机制及其在OSGi中的应用

    Java ClassLoader机制是Java虚拟机(JVM)中一个至关重要的组成部分,它的主要任务是将类的.class文件加载到JVM中,使得程序能够运行。ClassLoader不仅负责类的加载,还涉及类的验证、初始化等一系列过程。理解...

    Java ClassLoader定制实例

    在Java编程语言中,ClassLoader是一个至关重要的组成部分,它负责加载类到JVM(Java虚拟机)中。理解ClassLoader的工作原理以及如何定制它,对于深入学习Java的运行机制和进行高级应用开发具有重要意义。本篇文章将...

    lassLoader的关系以及如何防止ClassLoader内存泄漏

    在Java世界中,类加载器(ClassLoader)是关键的组件之一,它负责将类的字节码文件(.class)从文件系统或网络中加载到Java虚拟机(JVM)中,使得程序能够运行。本篇文章将深入探讨ClassLoader的关系网络以及如何...

    ClassLoader 详解.doc

    《ClassLoader详解》 Java应用程序的运行离不开类的加载,而ClassLoader正是这个过程的关键角色。它负责将类的字节码加载到Java虚拟机(JVM)中并转换为可执行的Java对象。深入理解ClassLoader的工作原理对于优化...

    classloader 加密解密应用程序 ,反编译class

    在Java编程语言中,`ClassLoader`是一个至关重要的组件,它负责加载类到JVM(Java虚拟机)中。本文将深入探讨`ClassLoader`的工作原理、加密解密应用程序以及如何防止类被反编译。 首先,让我们理解`ClassLoader`的...

    理解Java ClassLoader机制

    Java ClassLoader机制是Java运行时环境中的核心组件之一,它负责加载类到JVM(Java虚拟机)中,使得程序能够执行。理解ClassLoader的工作原理对于优化应用性能、处理类加载问题以及实现自定义加载器至关重要。 首先...

    ClassLoader类加载机制和原理详解

    在Java编程语言中,ClassLoader是核心组件之一,它负责加载类到JVM(Java虚拟机)中执行。本文将深入探讨ClassLoader的工作原理和类加载机制,帮助开发者理解这个至关重要的概念。 1. 类加载机制概述 Java的类加载...

    深入了解Java_ClassLoader,Bytecde.pdf

    ### 深入了解Java ClassLoader与Bytecode #### 一、Java ClassLoader概述 **1.1 什么是ClassLoader** 在传统的C/C++程序中,整个程序被编译成一个可执行文件,运行时一次性加载到内存中。而Java程序则不同,它是...

    ClassLoader的 一些测试

    在Java编程语言中,ClassLoader是一个至关重要的组成部分,它负责加载类到JVM(Java虚拟机)中执行。这篇测试主要探讨了ClassLoader的工作原理及其在实际应用中的使用。通过阅读给出的博文链接,我们可以深入理解...

    java classloader classpath 张孝祥

    ### Java ClassLoader与ClassPath详解 #### 一、概述 在Java编程中,类加载机制是十分关键的一个环节。类加载器(`ClassLoader`)负责将编译后的`.class`文件加载到Java虚拟机(JVM)中执行,而类路径(`ClassPath...

    classloader体系结构(含hotswap)

    Java的类加载器(ClassLoader)体系结构是JVM(Java虚拟机)中至关重要的一部分,它负责将类的字节码转换为运行时的类实例。本文将深入探讨启动类加载器、扩展类加载器、系统类加载器以及用户自定义类加载器,同时还...

    破解java加密的ClassLoader.java,在classloader植入破解代码

    破解java加密的ClassLoader.java,在classloader植入破解代码

Global site tag (gtag.js) - Google Analytics