`
dyy_gusi
  • 浏览: 209748 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Java中class是如何加载到JVM中的(Class.forName("name")和ClassLoader.loadClass("name")的区别)

    博客分类:
  • Java
阅读更多

Java中class是如何加载到JVM中的:
1.class加载到JVM中有三个步骤
    装载:(loading)找到class对应的字节码文件。
    连接:(linking)将对应的字节码文件读入到JVM中。
    初始化:(initializing)对class做相应的初始化动作。
2.Java中两种加载class到JVM中的方式
    2.1:Class.forName("className");
        其实这种方法调运的是:Class.forName(className, true, ClassLoader.getCallerClassLoader())方法
        参数一:className,需要加载的类的名称。
        参数二:true,是否对class进行初始化(需要initialize)
        参数三:classLoader,对应的类加载器

    2.2:ClassLoader.laodClass("className");
        其实这种方法调运的是:ClassLoader.loadClass(name, false)方法
        参数一:name,需要加载的类的名称
        参数二:false,这个类加载以后是否需要去连接(不需要linking)
       
    2.3:两种方式的区别
        forName("")得到的class是已经初始化完成的
        loadClass("")得到的class是还没有连接的
        一般情况下,这两个方法效果一样,都能装载Class。
        但如果程序依赖于Class是否被初始化,就必须用Class.forName(name)了。
3.举例说明他们各自的使用方法
    java使用JDBC连接数据库时候,我们首先需要加载数据库驱动。
    Class.forName("com.mysql.jdbc.Driver");//通过这种方式将驱动注册到驱动管理器上
    Connection conn = DriverManager.getConnection("url","userName","password");//通过驱动管理器获得相应的连接
    查看com.mysql.jdbc.Driver源码:

public class Driver extends NonRegisteringDriver
  implements java.sql.Driver
{
    //注意,这里有一个static的代码块,这个代码块将会在class初始化的时候执行
  static
  {
    try
    {
        //将这个驱动Driver注册到驱动管理器上
      DriverManager.registerDriver(new Driver());
    } catch (SQLException E) {
      throw new RuntimeException("Can't register driver!");
    }
  }
}

    Class.forName("com.mysql.jdbc.Driver")方法以后,他会进行class的初始化,执行static代码块。
    也就是说class初始化以后,就会将驱注册到DriverManageer上,之后才能通过DriverManager去获取相应的连接。
    但是要是我们使用ClassLoader.loadClass(com.mysql.jdbc.Driver)的话,不会link,更也不会初始化class。
    相应的就不会回将Driver注册到DriverManager上面,所以肯定不能通过DriverManager获取相应的连接。
       

3
2
分享到:
评论
3 楼 xsbird 2013-12-30  
同时用Class.forName() 和 ClassLoader.laodClass("className");
试了下,貌似都执行 static 块里的代码.
2 楼 dyy_gusi 2013-12-24  
xsbird 写道
测试了下,貌似不对

哪里不对,望指正
1 楼 xsbird 2013-12-24  
测试了下,貌似不对

相关推荐

    Java 类加载机制 ClassLoader Class.forName.pdf

    Java 类加载机制是Java虚拟机(JVM)中的一个重要组成部分,它负责将编译后的字节码文件(.class)加载到内存中,形成Class对象,以便于Java程序能够识别并使用这些类。深入理解类加载机制不仅有助于我们更好地理解JVM的...

    在Java的反射中,Class.forName和Class

    在Java的反射机制中,`Class.forName`和`ClassLoader`都是关键组件,它们允许程序在运行时动态加载类,提供了一种强大的灵活性。本文将详细探讨这两个概念以及它们之间的区别。 首先,`Class.forName`是Java.lang....

    jvm 加载class文件

    Java程序的运行依赖于类加载器将`.class`文件加载到JVM中,并对其进行验证、准备和解析等步骤,最终使类能够在JVM中执行。 #### 三、Class文件的加载过程 Java类的加载过程主要可以分为以下几个阶段: 1. **加载...

    Java ClassLoader Tutorial.zip

    1. 继承ClassLoader:开发者可以通过继承`java.lang.ClassLoader`并重写`loadClass()`方法来自定义类加载逻辑。 2. 加载自定义位置的类:自定义ClassLoader可以加载非标准路径的类,如从网络、数据库或其他存储介质...

    ClassLoader(类加载机制)1

    Java的类加载机制是其运行的核心部分,它涉及到如何将`.class`文件转换为内存中的类实例。在Java中,`ClassLoader`是负责这个过程的关键组件。本文将深入探讨ClassLoader的工作原理,Java类的结构,以及Java类的动态...

    Java类加载器(ClassLoader)1

    Java类加载器分为三种主要类型:引导类加载器(Bootstrap ClassLoader)、扩展类加载器(Extension ClassLoader)和应用程序类加载器(Application ClassLoader,也称为系统类加载器)。它们共同工作,确保了Java...

    Java类加载器.pdf

    Java类加载器是Java运行时环境的一个关键组成部分,负责将类文件(.class)从各种来源加载到JVM中。它不仅管理类的生命周期,还确保了类的正确加载和初始化,是Java动态特性的基石。 #### 类加载器的工作原理 Java...

    ClassLoader

    在Java中,`ClassLoader`是负责加载类到JVM的重要组件之一。它不仅能够确保每个被加载的类都具有唯一的标识符,还能处理类的生命周期中的加载、连接(验证、准备和解析)及初始化等关键步骤。 #### 类加载器的工作...

    Java技术----实现JAVA的动态类载入机制

    当调用`Class.forName()`或`ClassLoader.loadClass()`时,JVM会使用类加载器找到对应的类。 反射API是实现动态类加载的关键工具。`java.lang.reflect`包提供了`Class`类、`Constructor`类、`Method`类和`Field`类等...

    jdbc中class.forname的作用

    4. 避免仅加载不初始化:值得注意的是,如果只是简单地使用`ClassLoader.loadClass()` 加载类,而没有实例化或执行静态初始化,那么驱动不会被注册到`DriverManager`。这样,即使类被加载到JVM中,也无法通过`...

    ClassLoader 案例

    在Java编程语言中,ClassLoader是核心组件之一,它负责加载类到JVM(Java虚拟机)中。自定义ClassLoader允许开发者根据特定需求加载类,比如动态加载或更新类文件,这在某些高级应用场景中非常有用,如插件系统、热...

    在可执行jar中载入第三方jar的几个解决方法

    这个问题通常发生在使用`Class.forName()`或`ClassLoader.getSystemClassLoader().loadClass()`尝试动态加载第三方JAR中的类时。 Java虚拟机(JVM)的类加载机制是导致此问题的关键。自JDK 1.2以来,JVM采用委托...

    Java 动态加载jar文件示例

    在Java编程语言中,动态加载jar文件是一种关键的...通过创建自定义类加载器并覆盖其核心方法,我们可以按需加载和使用jar文件中的类,极大地提高了程序的灵活性。这在插件系统、模块化应用和云服务等场景中尤其有用。

    java 动态加载jar包

    通过Class类的forName()方法,我们能够根据类名加载类,即使该类在运行时并未被加载到JVM(Java虚拟机)中。例如: ```java try { Class<?> clazz = Class.forName("com.example.MyClass"); // 进一步的反射操作....

    JAVA类加载

    Java程序中的每个类和接口都被编译成独立的`.class`文件,这些文件作为Java运行环境的动态加载单元。 在Java中,类的加载分为**预先加载(pre-loading)**和**依需求加载(load-on-demand)**两种策略。预先加载...

    JAVA反射机制与类的加载

    在Java程序运行过程中,类加载器负责将类加载到JVM的内存中,而反射则提供了在运行时检查和操作这些类的能力。 类加载机制是Java虚拟机(JVM)的核心组成部分,它确保在需要时才加载类到内存。当程序启动时,主类...

    动态加载类机制JAVA

    - 自定义类加载器:开发者可以创建自己的类加载器子类,覆盖`loadClass()`方法,实现自定义的类查找和加载逻辑。 2. 双亲委派模型(Parent Delegation Model): - Java的类加载机制遵循双亲委派模型,即当一个类...

    Java 全栈知识点问题汇总(5).pdf

    在编程中,我们有时会用到`Class.forName()`和`ClassLoader.loadClass()`这两个方法。`Class.forName()`不仅加载类,还会执行类的静态初始化块,而`ClassLoader.loadClass()`仅加载类,不执行静态初始化。`Class.for...

    Java 动态加载jar和class文件实例解析

    显示机制是通过使用 java.lang.Class 的 forName() 方法或 java.lang.ClassLoader 的 loadClass() 方法来加载类的。例如,我们可以使用 `Class.forName("MyClass")` 来加载 MyClass 类。 java.lang.Class 的 for...

Global site tag (gtag.js) - Google Analytics