`
rainlife
  • 浏览: 233324 次
  • 性别: Icon_minigender_1
  • 来自: 我也来自火星?
社区版块
存档分类
最新评论

[笔记]类加载器

    博客分类:
  • JAVA
阅读更多
看了王森的《JAVA深度历险》,做了一个简单的学习笔记。
1. JAVA类装载器在装载类的时候是按需加载的,只有当一个类要使用(使用new 关键字来实例化一个类)的时候,类加载器才会加载这    个类并初始化。
    类Main:
   
java 代码
 
  1. public class Main {  
  2.     public static void main(String[] args) {  
  3.         A a = new A();  
  4.         a.print();  
  5.         B b = new B();  
  6.         b.print();  
  7.     }  
  8. }  
  
  类A:
java 代码
 
  1. public class A  {  
  2.     public void print() {  
  3.         System.out.println("Using Class A");  
  4.     }  
  5. }  

 类B:
java 代码
 
  1. public class B {  
  2.     public void print() {  
  3.         System.out.println("Using Class B");  
  4.     }  
  5. }  

执行:java -varbose:class Main
执行结果:
    E:\DEV>java -verbose:class Main
    [Opened C:\Program Files\Java\jre1.5.0_11\lib\rt.jar] (类装载器会首先加载rt.jar加载基础类)
    .
    .
    [Loaded Main from file:/E:/DEV/] (类装载器载入相应类并初始化)
    [Loaded A from file:/E:/DEV/]
    Using Class A
    [Loaded B from file:/E:/DEV/]
    Using Class B
2. 让JAVA程序具有动态性
   使用显式方式来实现动态性,我们需要自己动手处理类载入时的细节部分。

     两种方法:
    |
    +-- 隐式的 : 使用new关键字让类加载器按需求载入所需的类
    |
    +-- 显式的 :
                     |
                     +-- 由 java.lang.Class的forName()方法加载
                     |
                     +-- 由 java.lang.ClassLoader的loadClass()方法加载

    (1) 使用Class.forName()
    Class.forName()方法具有两个重载的方法:
            +- public static Class forName(String className)
            |
            +- public static Class forName(String className, boolean initialize,ClassLoader loader)
    参数说明:
        className - 所需类的完全限定名
        initialize - 是否必须初始化类(静态代码块的初始化)
        loader - 用于加载类的类加载器
调用只有一个参数的forName()方法等效于 Class.forName(className, true, loader)。
这两个方法,最后都要连接到原生方法forName0(),其定义如下:
private static native Class forName0(String name, boolean initialize,ClassLoader loader) throws ClassNotFoundException;
只有一个参数的forName()方法,最后调用的是:
forName0(className, true, ClassLoader.getCallerClassLoader());
而三个参数的forName(),最后调用的是:
forName0(name, initialize, loader);
所以,不管使用的是new 來实例化某个类、或是使用只有一个参数的Class.forName()方法,内部都隐含了“载入类 + 运行静态代码块”的步骤。而使用具有三个参数的Class.forName()方法时,如果第二个参数为false,那么类加载器只会加载类,而不会初始化静态代码块,只有当实例化这个类的时候,静态代码块才会被初始化,静态代码块是在类第一次实例化的时候才初始化的。

    (2) 直接使用类加载器
           +— 获得对象所属的类 : getClass()方法
           |
           +— 获得该类的类加载器 : getClassLoader()方法
java 代码
 
  1. public class Main3 {  
  2.     public static void main(String[] args) throws Exception {  
  3.         Main3 main3 = new Main3();  
  4.         System.out.println("准备载入类");  
  5.         ClassLoader loader = main3.getClass().getClassLoader();  
  6.         Class clazzA = loader.loadClass(args[0]);  
  7.         System.out.println("实例化类A");  
  8.         A o1 = (A) clazzA.newInstance();          
  9.     }  
  10. }  

3  类加载器的层次
                                           
  • 大小: 13.5 KB
分享到:
评论
12 楼 qingjian 2007-04-10  
不是太明白
11 楼 malipei 2007-04-10  
执行:java -varbose:class Main

改为:java -verbose:class Main
10 楼 coolyi88 2007-04-10  
頂頂、、
正在研究中、、、
9 楼 realreal2000 2007-04-10  
正在学习中
8 楼 leonardleonard 2007-04-10  
收藏先
7 楼 xueyinglan 2007-04-09  
能不能举个实际项目中的例子来说明它的用法和作用啊?
6 楼 Cecily 2007-04-09  
很好啊 ,描述的简单明了,例子也很能说明问题
5 楼 hbcui1984 2007-04-06  
不错的,最近正在看“java反射”的东东
4 楼 rainlife 2007-04-05  
twjava 写道
受教了,说起类加载,我想问一下,我要是把一个动态库打包在jar中,好像无法加载,但是在Eclipse中,swt的动态库都是放在jar包中的呀,请各位大侠多指教。

我们可以通过java.net.URLClassLoader这个类构建一个自己的类加载器,来载入自己所需要的类。
下面是JDK中的说明:

public class URLClassLoader
extends SecureClassLoader
该类加载器用于从指向 JAR 文件和目录的 URL 的搜索路径加载类和资源。这里假定任何以 '/' 结束的 URL 都是指向目录的。如果不是以该字符结束,则认为该 URL 指向一个将根据需要打开的 JAR 文件。
3 楼 twjava 2007-04-05  
受教了,说起类加载,我想问一下,我要是把一个动态库打包在jar中,好像无法加载,但是在Eclipse中,swt的动态库都是放在jar包中的呀,请各位大侠多指教。
2 楼 piaochunzhi 2007-04-05  
模式 , 不会也得看, 说不上 哪天就开窍了!
1 楼 solospider 2007-04-05  
顶一个,最近也在看这方面的知识

相关推荐

    黑马程序员------类加载器学习注意点

    Java的类加载器体系采用的是双亲委派模型,这意味着当一个类加载器接收到加载类的请求时,它会首先将任务委托给父类加载器,只有当父类加载器无法找到该类时,子类加载器才会尝试自己加载。 其次,自定义类加载器是...

    java 类加载器学习笔记1

    Java 类加载器是Java虚拟机(JVM)的重要组成部分,它负责将类的.class文件从文件系统或网络中加载到内存中,并将其转换为运行时的类对象。类加载器的这种动态加载机制为Java提供了极高的灵活性,使得程序可以在运行...

    java基础学习笔记之类加载器

    Java 类加载器是Java虚拟机(JVM)的关键组成部分,它们负责在运行时动态加载所需的类。类加载器基于三个核心机制:委托、可见性和单一性。 1. **委托机制**: - 当一个类加载器收到加载类的请求时,它首先不会...

    深入Java虚拟机JVM类加载学习笔记

    - **应用类加载器(Application ClassLoader)**:也称为系统类加载器,负责加载用户类路径(ClassPath)所指定的类。 **1.2 双亲委派模型** Java类加载器采用双亲委派模型,其流程如下: 1. 如果一个类加载器收到...

    类的加载机制笔记

    3. **应用程序类加载器(Application ClassLoader)**:也称为系统类加载器,它是ClassLoader类的默认实例,主要负责加载当前应用程序的类路径(ClassPath)所指定的jar或类文件。开发者可以创建自己的类加载器继承...

    Java虚拟机JVM类加载学习笔记

    JVM的类加载器(ClassLoader)负责将编译后的`.class`文件加载到内存中,为程序执行做好准备。当类被加载时,JVM会在内存的运行时数据区的方法区内存储类的信息,并在堆中创建一个`java.lang.Class`对象来封装这些...

    java读书笔记笔记笔记笔记笔记笔记

    综上所述,这份Java读书笔记可能涵盖了JVM的工作原理,特别是类的加载和执行过程,以及this关键字在代码中的应用。通过阅读Execution.htm和初始化总结this关键字.ppt,读者可以深化对Java程序执行流程和对象初始化的...

    jvm视频及笔记

    5. **类加载器**:系统类加载器、扩展类加载器和应用程序类加载器之间的双亲委派模型,以及自定义类加载器的实现。 6. **JVM调优**:通过调整JVM参数,如-Xms、-Xmx设置堆大小,-XX:NewRatio设定新生代与老年代比例...

    JVM学习笔记(一)——类的加载机制

    类加载机制遵循双亲委派模型,即当一个类加载器收到加载类的请求时,它首先会委托父类加载器尝试加载,只有当父类加载器无法加载时,子类加载器才会尝试加载。这样可以避免类的重复加载,保证核心类库的唯一性。 4...

    jvm学习笔记(jvm内存模型&垃圾收集算法&类加载机制)

    在JVM的学习中,理解其内存模型、垃圾收集算法以及类加载机制至关重要。 1. **JVM内存模型** - **方法区**:也称为“永久代”,存储虚拟机加载的类信息、常量、静态变量等,是线程共享的区域。在Java 8之后,这...

    火狐浏览器不支持有道云笔记网页版

    火狐浏览器不支持有道云笔记网页版的问题可能是由于浏览器兼容性、JavaScript 文件加载、样式表加载或浏览器插件问题引起的。用户可以尝试使用其他浏览器、禁用浏览器插件或使用客户端软件来解决问题。

    java之jvm学习笔记五(实践写自己的类装载器)

    这个“java之jvm学习笔记五(实践写自己的类装载器)”很可能是对这一主题的详细探讨。 类装载器在Java中的主要职责是动态加载类到JVM中。Java的类装载器分为三个基本层次:启动类装载器(Bootstrap ClassLoader)、...

    java 学习笔记(经典)

    根据提供的文件信息,这里将对Java学习笔记中的关键知识点进行详细阐述,主要涉及Java语言的基础概念、面向对象编程思想的应用以及Java类加载器的工作原理等内容。 ### Java学习基础 Java是一种广泛使用的高级编程...

    linux笔记笔记笔记笔记

    这个过程包括配置内核选项、编译源码、安装内核模块和更新引导加载器。 7. **鸟哥私房菜Linux**:这是一本广受欢迎的Linux入门书籍,涵盖了Linux系统的方方面面,从基本命令到系统管理,适合初学者和有经验的管理员...

    c#笔记本类练习.rar

    4. 构造函数与初始化:`Notebook`类可能有一个构造函数,用于初始化实例并加载已有的笔记本数据。 5. 错误处理:在增删改查操作中,代码可能会包含适当的错误处理,以防止如文件不存在或数据格式错误等情况。 6. ...

    连接器和加载器beta2.pdf

    ### 连接器和加载器基础知识 #### 1. 连接器和加载器功能概述 连接器和加载器是计算机程序构建过程中不可或缺的两个部分。连接器(Linker)负责将编译后的代码模块(通常是对象文件)合并成一个可执行文件。加载器...

    张孝祥J2SE加强自学笔记(48-56)

    【张孝祥J2SE加强自学笔记(48-56)】主要涵盖了类加载器、代理类和动态类创建等Java核心知识点。 48、类加载器的问题实验分析: 在Java中,类加载器是负责查找并加载类的机制。在Web应用中,有多种类加载器,如...

    JVM笔记.docx

    类装载器分为启动类加载器(Bootstrap ClassLoader)、扩展类加载器(Extension ClassLoader)和应用程序类加载器(AppClassLoader),以及用户自定义的类加载器。 2. 运行时数据区:包括方法区(Method Area)、...

    jvm上篇笔记.md

    类加载器之间的继承关系遵循着“父委托模型”,即一个类加载器在加载类之前会先委托给父类加载器尝试加载,只有当父类加载器无法加载时,才会自行加载。 通过上述分析,我们可以看到JVM是如何通过类加载子系统来...

Global site tag (gtag.js) - Google Analytics