`

java反射中class.forName和classLoader加载类的区分

 
阅读更多

  java中class.forName和classLoader都可用来对类进行加载。前者除了将类的.class文件加载到jvm中之外,还会对类进行解释,执行类中的static块。而classLoader只干一件事情,就是将.class文件加载到jvm中,不会执行static中的内容,只有在newInstance才会去执行static块。Class.forName(name, initialize, loader)带参函数也可控制是否加载static块。并且只有调用了newInstance()方法采用调用构造函数,创建类的对象 
事例代码如下: 
1.使用classLoader加载 

    System.out.println("before loadClass... "); 
    Class c =Test.class.getClassLoader().loadClass("com.hundsun.test.ClassInfo"); 
    System.out.println("after loadClass... "); 
    System.out.println("before newInstance... "); 
    ClassInfo info1 =(ClassInfo) c.newInstance(); 
    System.out.println("after newInstance... "); 

输出结果: 
before loadClass... 
after loadClass... 
before newInstance... 
static invoked... 
contruct invoked... 
after newInstance... 

2.使用class.forName进行加载 

System.out.println("before class.forName"); 
Class cc =Class.forName("com.hundsun.test.ClassInfo"); 
System.out.println("after class.forName"); 
ClassInfo info2 =(ClassInfo) cc.newInstance(); 
输出结果: 
before class.forName 
static invoked... 
after class.forName 
before newInstance... 
contruct invoked... 
after newInstance... 

下面说一下两者具体的执行过程 
LoadClass()方法加载类及初始化过程: 
类加载(loadclass())(加载)——》newInstance()(链接+初始化) 
newInstance(): 
(开始连接)静态代码块——》普通变量分配准备(a=0;b=0;c=null)——》(开始初始化)普通变量赋值(a=1;b=2;c=”haha”)——》构造方法——》初始化成功。 


Class.forName(Stirng className)一个参数方法加载类及初始化过程: 
类加载(Class.forName())(加载)——》静态代码块——》newInstance()(链接+初始化) 

newInstance(): 
(开始连接)普通变量分配准备(a=0;b=0;c=null)——》(开始初始化)普通变量赋值(a=1;b=2;c=”haha”)——》构造方法——》初始化成功。 


Class.forName()三个参数的加载类及初始化过程同classLoader一样。 

从上边的断点调试可以看出,静态代码块不是在初始化阶段完成的,它陷于类初始化,先于普通变量默认分配(整型分配为0,字符串分配为null),这也就是为什么我们不能在静态代码块中引用普通变量的原因之一,这与上面所谓的“分配”、“初始化”相违背。 

所以我觉得JVM的类加载及初始化过程应该是这样的。 

1. 类加载:Bootstrap Loader——》Extended Loader——》System Loader 
2. 静态代码块初始化 
3. 链接: 
a) 验证:是否符合java规范 
b) 准备:默认初始值 
c) 解析:符号引用转为直接引用,解析地址 
4. 初始化 
a) 赋值:java代码中的初始值 
b) 构造:构造函数 

分享到:
评论

相关推荐

    java中Class.forName方法的作用详解

    总的来说,`Class.forName()`在Java中起到了动态加载和初始化类的关键作用,尤其在JDBC和其他需要延迟加载或动态选择实现的场景中。了解这个方法的工作原理,对于理解Java程序的运行机制和优化代码是十分重要的。在...

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

    在Java的反射机制中,`Class.forName`和`ClassLoader`都是关键组件,它们在程序运行时动态加载类和实现类的实例化方面扮演着重要角色。理解这两个概念及其区别是深入掌握Java反射的重要一步。 首先,`Class.forName...

    Class.forName

    `Class.forName()`是Java中一个非常重要的方法,它主要用于动态加载和实例化类。这个方法在编程中常常用于实现灵活性和解耦,特别是在框架和插件系统中。下面将详细解释`Class.forName()`的工作原理、用途及其与`new...

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

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

    liuwei1989#study-guide#17-Class.forName和classloader的区别1

    并且只有调用了newInstance()方法采用调用构造函数,创建类的对象看下Class.forName()源码//Class.forName(String c

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

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

    Java类加载器.pdf

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

    Classfor的用法

    `Class.forName` 是 Java 反射 API 中的一个重要方法,主要用于动态加载类。该方法的主要作用是根据提供的全限定类名来加载并返回对应的 `Class` 对象。在 Java 开发过程中,当我们需要根据用户的输入或者配置文件中...

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

    破解java加密的rt.jar,在classloader植入破解代码,默认输出到c:/TEMP/classes/目录。使用方法:只要下载本rt.jar,然后替换掉jdk1.8.0_25\jre\lib目录下的rt.jar。然后运行你需要破解的java程序即可,如果你的java...

    resolver_java_wsdl.jar

    at java.lang.ClassLoader.loadClass(ClassLoader.java:667) at com.ibm.ws.bootstrap.ExtClassLoader.loadClass(ExtClassLoader.java:119) at java.lang.ClassLoader.loadClass(ClassLoader.java:650) at ...

    ClassLoader

    3. **在Java堆中生成一个代表这个类的`java.lang.Class`对象**,作为方法区这些数据的访问入口。 #### 三、Java中类加载器的几种方法 1. **`loadClass`**: 遵循双亲委托机制,尝试加载指定类。此方法先检查是否...

    jdbc中class.forname的作用

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

    ClassLoader类加载机制和原理详解

    本文将深入探讨ClassLoader的工作原理和类加载机制,帮助开发者理解这个至关重要的概念。 1. 类加载机制概述 Java的类加载机制遵循“双亲委派模型”(Delegation Model)。当一个类被加载时,它首先会尝试由当前...

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

    检查实现类.class文件的修改时间,如果是更新的.class文件则重新加载该实现类的class。 4. 调用方法前,先获取最新的代理类,然后调用代理类的方法。 这样,每次调用代理类中的方法,都会先检查实现类的class文件...

    jdbc--sqljdbc4-2.0.jar

    java链接sqlserver数据库包如下错误时: java.lang.ClassNotFoundException: ... at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Unknown Source) 添加sqljdbc4-2.0包即可

    ClassLoader(类加载机制)1

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

    java中的Class类和反射.docx

    ### Java中的Class类和反射详解 #### 一、Class类的作用与意义 在Java中,`Class`类是一个非常核心且强大的类,它提供了一系列的方法来获取类的信息以及操作类。`Class`类实例通常代表了一个正在运行的Java应用...

    Java ClassLoader Tutorial.zip

    2. 加载自定义位置的类:自定义ClassLoader可以加载非标准路径的类,如从网络、数据库或其他存储介质中加载。 3. 混合加载:在某些场景下,可能需要混合加载来自不同来源的类,这时可以创建多个自定义类加载器,每...

    JAVA反射机制与类的加载

    总的来说,Java反射机制和类加载机制为开发者提供了强大的工具,可以用于动态编程、插件系统、元编程等多种场景。然而,由于反射操作涉及到安全性问题和性能开销,因此在实际使用时应谨慎考虑。

Global site tag (gtag.js) - Google Analytics