`
顽石OK07
  • 浏览: 83883 次
  • 性别: Icon_minigender_2
  • 来自: 上海
社区版块
存档分类
最新评论

Java中ClassLoader

阅读更多
本想写一篇有关ClassLoader方面的小结,没想到在JavaEye上已经有了,转到这里。原文网址是:
http://www.iteye.com/topic/25053 

    JVM 
    jvm是jre里头一个动态连接函数库,jdk里面的jre一般用于运行java本身的程序,比如javac,等等.programfiles下面的jre用于运行用户编写的java程序. 
    JRE下的bin\client 或者 bin\server 的jvm.dll就是JVM了 

     

    当一台机器上有多个jvm可选择的时候,jvm的选择步骤: 
    1)当前目录有没有jre目录(不准确), 
    2)父目录下的jre子目录 
    3)注册表HEKY_LOCAL_MACHINE\SoftWare\Java\Java Runtime Environment\ 
    所以当运行的是jdk\bin\java.exe的时候,用的jre是bin的父目录jdk下面的jre\ 
    运行java.exe找到了jre后有一个验证程序,验证jre和java.exe的版本是否一致,如果不一致则会发生错误


    java -verbose:class Main 显示调用的详细信息

    classloader的两种载入方式:1)pre-loading预先载入,载入基础类 2)load-on-demand按需求载入 
    只有实例化一个类才会被classloader载入,仅仅申明并不会载入

    java动态载入class的两种方式: 
    1)implicit隐式,即利用实例化才载入的特性来动态载入class 
    2)explicit显式方式,又分两种方式: 
    1)java.lang.Class的forName()方法 
    2)java.lang.ClassLoader的loadClass()方法

    static块在什么时候执行? 
    1)当调用forName(String)载入class时执行,如果调用ClassLoader.loadClass并不会执行.forName(String,false,ClassLoader)时也不会执行. 
    2)如果载入Class时没有执行static块则在第一次实例化时执行.比如new ,Class.newInstance()操作 
    3)static块仅执行一次


    Class类的实例. 
    >>Class类无法手工实例化,当载入任意类的时候自动创建一个该类对应的Class的实例, 
    >>某个类的所有实例内部都有一个栏位记录着该类对应的Class的实例的位置., 
    >>每个java类对应的Class实例可以当作是类在内存中的代理人.所以当要获得类的信息(如有哪些类变量,有哪些方法)时,都可以让类对应的Class的实例代劳.java的Reflection机制就大量的使用这种方法来实现 
    >>每个java类都是由某个classLoader(ClassLoader的实例)来载入的,因此Class类别的实例中都会有栏位记录他的ClassLoader的实例,如果该栏位为null,则表示该类别是由bootstrap loader载入的(也称root laoder),bootstrap loader不是java所写成,所以没有实例. 

     

    原生方法:forName0()等方法,native修饰符


    自定义ClassLoader: 
    如实例化一个URLClassLoader. URLClassLoader ucl = new URLClassLoader(new URL[]{new URL("file:/e:/bin/")}),URLClassLoader优先找当前目录,再在url中找.class加载.URL中别忘在最后加"/"表示目录

    各个java类由哪些classLoader加载? 
    1)java类可以通过实例.getClass.getClassLoader()得知 
    2)接口由AppClassLoader(System ClassLoader,可以由ClassLoader.getSystemClassLoader()获得实例)载入 
    3)ClassLoader类由bootstrap loader载入

    ClassLoader hierachy: 
    jvm建立->初始化动作->产生第一个ClassLoader,即bootstrap loader->bootstrap loader在sum.misc.Launcher类里面的ExtClassLoader,并设定其Parent为null->bootstrap loader载入sun.misc.Launcher$AppClassLoader,并设定其parent为ExtClassLoader(但是AppClassLoader也是由bootstrap loader所载入的)->AppClassLoader载入各个xx.class,xx.class也有可能被ExtclassLoader或者bootstrap loader载入. 
    >>自定义的ClassLoader的.getParent()是AppClassLoader.parent和他的加载器并没有关系 
    >>ExtClassLoader和AppClassLoader都是URLClassLoader的子类.AppClassLoader的URL是由系统参数java.class.path取出的字符串决定,而java.class.path由 运行java.exe时 的-cp或-classpath或CLASSPATH环境变量决定 
    >>ExtClassLoader查找的url是系统变量java.ext.dirs,java.ext.dirs默认为jdk\jre\lib\ext 
    >>Bootstrap loader的查找url是sun.boot.class.path 
    >>在程序运行后调用System.setProperty()来改变系统变量并不能改变以上加载的路径,因为classloader读取在System.setProperty之前.sun.boot.class.path是在程序中写死的,完全不能修改 

     

    委派模型 
    当classloader有类需要载入时先让其parent搜寻其搜寻路径帮忙载入,如果parent找不到,在由自己搜寻自己的搜寻路径载入,ClassLoader hierachy本来就有这种性质



    NoClassDefFoundError和ClassNotFoundException 
    NoClassDefFoundError:当java源文件已编译成.class文件,但是ClassLoader在运行期间在其搜寻路径load某个类时,没有找到.class文件则报这个错 
    ClassNotFoundException:试图通过一个String变量来创建一个Class类时不成功则抛出这个异常

 

 

 

分享到:
评论

相关推荐

    java中classLoader的使用

    Java中的类加载器(ClassLoader)是Java虚拟机(JVM)的一个重要组成部分,它负责将类的.class文件从文件系统或者网络中加载到内存中,并转换为对应的Class对象。类加载器的工作流程主要包括加载、验证、准备、解析...

    java中ClassLoader

    Java 中的 ClassLoader Java 中的 ClassLoader 是一个非常重要的组件,它负责动态加载 class 文件到虚拟机当中,并将其转换成 java.lang.Class 类的一个实例。每个这样的实例用来表示一个 Java 类,因此我们可以...

    java classloader classpath 张孝祥

    类加载器(`ClassLoader`)是Java运行时环境的一部分,它的主要职责是从文件系统或网络中获取字节码,将其转换为`Class`对象,并在Java虚拟机中运行。Java中的类加载机制遵循“按需加载”原则,即只有当程序真正需要...

    Java中ClassLoader类加载学习总结

    Java中ClassLoader类加载学习总结 ClassLoader类加载是Java语言的一种创新,目的是为了将类的加载过程与虚拟机解耦,达到”通过类的全限定名来获取描述此类的二进制字节流“的目的。类加载器的基本模型就是双亲委派...

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

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

    Java ClassLoader定制实例

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

    java classloader

    Java ClassLoader是一个核心的Java运行时组件,负责加载类到Java虚拟机(JVM)中。它是Java平台的独特特性,因为它允许动态加载类,增强了软件的可扩展性和灵活性。这篇博文(虽然链接不可用)可能深入探讨了...

    探究java的ClassLoader及类变量初始化顺序

    在Java编程语言中,ClassLoader是核心组件之一,它负责加载类到JVM(Java虚拟机)中。理解ClassLoader的工作机制以及类变量初始化的顺序对于深入理解Java运行时环境至关重要。这篇博文将探讨这两个主题。 首先,让...

    测试普通Java程序ClassLoader等级关系的Demo程序

    本Demo程序主要探讨的是Java中的ClassLoader等级关系,这一主题对于理解Java应用程序的运行机制至关重要。 首先,我们要了解ClassLoader的基本概念。在Java中,ClassLoader是一个系统组件,它根据指定的全限定类名...

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

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

    Java_ClassLoader详解

    在 Java 语言中,类加载器(ClassLoader)是 Java 运行时环境的核心组成部分之一,它负责将编译后的 `.class` 文件加载到 JVM 中执行。从 JDK 1.0 开始,随着 Java Applet 的出现以及网络应用的需求增加,类加载机制...

    理解Java ClassLoader机制

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

    Java ClassLoader原理

    ### Java ClassLoader原理详解 #### 摘要 本文探讨了Java虚拟机(JVM)中的一个重要特性:动态类加载(Dynamic Class Loading)。这一机制为Java平台提供了强大的能力,允许在运行时安装软件组件,例如从网络下载...

    Java实现热加载完整代码;Java动态加载class;Java覆盖已加载的class;Java自定义classloader

    让Java支持热加载是个不错的想法。如何做到的呢? 1. 定义好接口和实现类 2. 让代理类通过反射的方式调用实现类,对外暴露的是代理类。 3. 自定义URLClassLoader。检查实现类.class文件的...Java自定义classloader;

    Java ClassLoader学习总结

    ClassLoader 是 Java 中的一个抽象类,它的主要作用是加载 Class 文件到 JVM 中。ClassLoader 使用了双亲委托模式进行类加载,每一个自定义的 ClassLoader 都必须继承 ClassLoader 这个抽象类,而每个 ClassLoader ...

    java的ClassLoader类加载器机制

    在 Java 虚拟机(JVM)中,类加载器(ClassLoader)扮演着非常重要的角色。类加载器负责加载 Java 类,包括核心类和用户自定义类。在 JVM 运行过程中,类加载器会形成一个层次结构,包括引导类加载器(Bootstrap ...

    ClassLoader

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

Global site tag (gtag.js) - Google Analytics