千家信息网

Class.forName和classloader加载类有什么不同

发表于:2025-02-08 作者:千家信息网编辑
千家信息网最后更新 2025年02月08日,今天就跟大家聊聊有关Class.forName和classloader加载类有什么不同,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。一、类加载
千家信息网最后更新 2025年02月08日Class.forName和classloader加载类有什么不同

今天就跟大家聊聊有关Class.forName和classloader加载类有什么不同,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

一、类加载机制

往细了看大致分为5个阶段:

(1)加载:java类运行时候会生成一个class字节码文件,加载的过程就是去我们的操作系统寻找这个class文件。

(2)链接:这个过程就是把class文件加载到java虚拟机。

(3)初始化:在虚拟机中根据class文件进行初始化。

(4)使用:这个过程大家都明白。

(5)卸载:使用完了,java虚拟机进行清理。

对于class.forName和classloader来说针对的就是第一个过程,也就是加载过程。不过这俩虽然有一定的相似性,但是区别还是挺大的。

二 分析 Class.forName()和ClassLoader.loadClass

我们使用代码,先看看如何使用。注意包的范围,避免加载不了。

第一步:定义User类

第二步:测试

我们在上面的test方法中,使用了两个加载方法。现在我们测试一下:

是不感觉有点区别。现在是先给出一个大体的使用,下面我们分析一下他们的区别。

二、区别

1、class.forName

class.forName()前者除了将类的.class文件加载到jvm中之外,还会对类进行解释,执行类中的static块。注意这里的静态块指的是在类初始化时的一些数据。但是classloader却没有,想要弄清楚这个原因,还是直接到源码中看看。

在这个源码中我们会发现,其实底层真正实现的是forName0方法,那这几个参数又是什么意思呢?

(1)className:表示我们要加载的类名

(2)true:指Class被加载后是不是必须被初始化。 不初始化就是不执行static的代码即静态代码,在这里默认为true,也就是默认实现类的初始化。

(3)ClassLoader.getClassLoader(caller):表示类加载器,到这你会发现forNanme其实也是使用的ClassLoader类加载器加载的。

(4)caller:指定类加载器。

Class.forName(className)方法,内部实际调用的方法是  Class.forName(className,true,classloader);第2个boolean参数表示类是否需要初始化,  Class.forName(className)默认是需要初始化。一旦初始化,就会触发目标对象的 static块代码执行,static参数也也会被再次初始化。

2、classloader

在上面的案例中我们发现,classloader并没有初始化静态块,原因最好还是到源码中看。

首先我们先进入到loadclass方法中的源码。

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

这一步看起来还看不明白,没关系这里真正实现的是内部的loadclass,我们再跟进去看看。

这个才是真正实现的方法,在这里的步骤其实很简单,大致流程是先判断class是否已经被加载,如果被加载了那就重新加载,如果没有加载那就使用双亲委派原则加载。加载的时候并没有指定是否要进行初始化。

所以现在他们的区别基本上很少,总结一下:

(1)class.forName()除了将类的.class文件加载到jvm中之外,还会对类进行解释,执行类中的static块。当然还可以指定是否执行静态块。

(2)classLoader只干一件事情,就是将.class文件加载到jvm中,不会执行static中的内容,只有在newInstance才会去执行static块。

数据库链接为什么使用Class.forName(className)

static {    try {        java.sql.DriverManager.registerDriver(new Driver());    } catch (SQLException E) {        throw new RuntimeException("Can't register driver!");    }}

看完上述内容,你们对Class.forName和classloader加载类有什么不同有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注行业资讯频道,感谢大家的支持。

文件 方法 就是 过程 代码 内容 源码 静态 参数 还是 不同 也就是 原因 数据 时候 链接 面的 分析 测试 解释 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 小程序免费服务器怎么样 国产uos系统软件开发 微信服务号开发者服务器 科技相对论网络安全 为什么投屏连接服务器失败 苏州互联网网络科技招聘 学术界对网络安全的研究报告 江苏电商网络技术服务供应商家 世界互联网大会科技动图 机房服务器带外管理 手机服务器的ip地址怎么填写 华为5500v3是高档服务器吗 信息与网络安全的最大威胁 网络安全引起反响排行 软件开发投标需要材料 网络安全法线上答题总结 杭州一狐网络技术有限公司 软件开发事业目标 启动数据库的注意事项 高职网络安全专业 服务器BGA的尺寸 苹果系统vpn服务器地址 数据库执行语句需要加数据库名吗 为维护网络安全颁布的法律 北京兼职互联网科技有限公司 信息与网络安全的最大威胁 cms监控软件服务器 北京软件开发公司聚地 我的世界服务器创建 火影忍者哪个服务器不氪
0