IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> JDK1.8.Java类加载,Class.forName()和ClassLoader.loadClass()的区别 -> 正文阅读

[Java知识库]JDK1.8.Java类加载,Class.forName()和ClassLoader.loadClass()的区别

在这里插入图片描述


ClassLoader.loadClass()

public class test {
    public static void main(String[] args) {
        Class loader = loader();
        System.out.println("loader = " + loader);
    }
    public static Class loader(){
        ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
        try {
            Class<?> aClass = classLoader.loadClass("com.lwl.test.Factory");
            return aClass;
        }catch (Exception e){
            throw new RuntimeException(e);
        }
    }
}

class Factory {
    private final static Factory instance = new Factory();

    private Factory() {
        System.out.println("初始化");
    }

    public static Factory getInstance() {
        return instance;
    }
}

根据图的推论,我们可以得知,一个类的类加载全过程 比如会为静态变量默认值->初始值。在代码中,我使用了单例模式,也就是说,类加载时,若要为静态变量instance赋初始值的话,必然会执行构造器方法,同时执行打印,但实际运行发现,并没有执行,也就是说,这个单例甚至都没有初始化。


Class.forName()

public class test {
    public static void main(String[] args) {
       // Class loader = loader();
        Class aClass = forName();
    }
    

    public static Class forName(){
        try {
            Class<?> aClass = Class.forName("com.lwl.test.Factory");
            return aClass;
        }catch (Exception e){
            throw new RuntimeException(e);
        }
    }
}

class Factory {
    private final static Factory instance = new Factory();

    private Factory() {
        System.out.println("初始化");
    }

    public static Factory getInstance() {
        return instance;
    }
}

当我使用Class.forName执行时,打印后发现Factory成功初始化。而这两个不同的类加载方法返回的Class对象为同一个。


造成这样的原因:

ClassLoader.loadClass的源码:

   public Class<?> loadClass(String name) throws ClassNotFoundException {
        return loadClass(name, false);
    }

 protected Class<?> loadClass(String name, boolean resolve)
        throws ClassNotFoundException
    {
    ......

可以发现 loadClass(String name, boolean resolve)在loadClass(String name)的调用中 resolve表示是否解析Class,默认为false,而且这个方法是protected 受保护的,也就是说我们无法在外部进行调用。
loadClass(String name) 方法无法执行到initializing初始化的阶段,因为Linking阶段都没到,在loading阶段获得Class对象后,参数为false,拒绝解析Class对象,直接返回。
Class.forName的源码:

    public static Class<?> forName(String className)
                throws ClassNotFoundException {
        Class<?> caller = Reflection.getCallerClass();
        return forName0(className, true, ClassLoader.getClassLoader(caller), caller);
    }
 private static native Class<?> forName0(String name, boolean initialize,
                                            ClassLoader loader,
                                            Class<?> caller)
        throws ClassNotFoundException;

forName(String className)方法中表示是否进行initialize初始化阶段的判断参数默认值为true,且因为forName0是个private方法,无法外部调用,所以我们使用Class.forName进行类加载时,静态变量也得到了初始化赋值。一切皆由源码决定的。


总结:

Class.forName() 对于类加载的三个阶段执行完了
ClassLoader.loadClass()只执行了类加载的第一个阶段loading 获得Class对象后就返回了。
两者只有一个不同点就是,执行阶段不同!Class对象是唯一的。

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-04-30 08:33:07  更:2022-04-30 08:36:48 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 2:21:23-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码