Java中Class.forName和 ClassLoader.loadClass()区别

一、类加载过程


装载:通过累的全限定名获取二进制字节流,将二进制字节流转换成方法区中的运行时数据结构,在内存中生成Java.lang.class对象; 
 
链接:执行下面的校验、准备和解析步骤,其中解析步骤是可以选择的; 
 
  校验:检查导入类或接口的二进制数据的正确性;(文件格式验证,元数据验证,字节码验.           证,符号引用验证) 
 
  准备:给类的静态变量分配并初始化存储空间; 
 
  解析:将常量池中的符号引用转成直接引用; 
 
初始化:激活类的静态变量的初始化Java代码和静态Java代码块,并初始化程序员设置的变量值。

二、两种加载类方式的区别


Java中Class.forName和classloader都可以用来对类进行加载。

  Class.forName(“className”);
        其实这种方法调运的是:Class.forName(className, true, ClassLoader.getCallerClassLoader())方法
        参数一:className,需要加载的类的名称。
        参数二:true,是否对class进行初始化(需要initialize)
        参数三:classLoader,对应的类加载器

   ClassLoader.laodClass(“className”);
        其实这种方法调运的是:ClassLoader.loadClass(name, false)方法
        参数一:name,需要加载的类的名称
        参数二:false,这个类加载以后是否需要去连接(不需要linking)

可见Class.forName除了将类的.class文件加载到jvm中之外,还会对类进行解释,执行类中的static块。

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

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

JDBC  Driver源码如下,因此使用Class.forName(classname)才能在反射回去类的时候执行static块。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/268818.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

变量在内存中的值[c][code]

#include <stdio.h>main() { /*%d所能输出的范围*/printf("%d \n", 0xffffffff); //%d所能输出的32位整数, 最大负整数printf("%d \n", 0x7fffffff); //%d所能输出的32位整数, 最大正整数/*单双精度浮点变量a,b,c,d在内存中的地址和内容 * …

Servlet 生命周期

Servlet 生命周期&#xff1a;Servlet 加载--->实例化--->服务--->销毁。init&#xff08;&#xff09;&#xff1a;在Servlet的生命周期中&#xff0c;仅执行一次init()方法。它是在服务器装入Servlet时执行的&#xff0c;负责初始化Servlet对象。可以配置服务器&…

java mysql防重复提交_防止数据重复提交的6种方法(超简单)!

有位朋友&#xff0c;某天突然问磊哥&#xff1a;在 Java 中&#xff0c;防止重复提交最简单的方案是什么&#xff1f;这句话中包含了两个关键信息&#xff0c;第一&#xff1a;防止重复提交&#xff1b;第二&#xff1a;最简单。于是磊哥问他&#xff0c;是单机环境还是分布式…

HttpRequest 类

关于此类的介绍&#xff1a;查看HttpRequest类 点击查看&#xff1a;HttpRequest中方法的封装 跟这个类对应的HttpResponse类 定义&#xff1a;使 ASP.NET 能够读取客户端在 Web 请求期间发送的 HTTP 值。 public sealed class HttpRequest 注&#xff1a;本篇主要介绍可以根据…

java中的HashSet内部是如何工作的

HashSet 的内部采用 HashMap来实现。由于 Map 需要 key 和 value&#xff0c;所以HashSet中所有 key 的都有一个默认 value。 类似于HashMap&#xff0c;HashSet 不允许重复的 key&#xff0c;只允许有一个null key&#xff0c;意思就是 HashSet 中只允许存储一个 null 对象。…

python字符串函数运算_Python入门教程2. 字符串基本操作【运算、格式化输出、常用函数】 原创...

前面简单介绍了python基本运算&#xff0c;这里再来简单讲述一下Python字符串相关操作1. 字符串表示方法 >>> "www.jb51.net" #字符串使用单引号()或双引号(")表示www.jb51.net>>> www.jb51.netwww.jb51.net>>> "www."&qu…

自定义报表预览控制工具条

说明&#xff1a;原有的VFP的打印预览用多了感觉真的不是很方便&#xff0c;在某些特定的要求下&#xff0c;她就显得很笨拙&#xff0c;尤其那个打印工具条上的打印机按纽&#xff0c;一点就打印了&#xff0c;有时候我们需要在那个时候进行有选择性的打印而不是全盘的打出来&…

Struts2结果跳转方式

1.转发 <!-- 转发 --> <action name"Demo1Action" class"cn.itheima.a_result.Demo1Action" method"execute" ><result name"success" type"dispatcher" >/hello.jsp</result> </action> 2.…

mysql gid_mysql主从复制5.6基于GID及多线程的复制笔记

mysql:数据库复制过滤#show grobal variables like binlog%;注意&#xff1a;不能在主服务器上做过滤&#xff0c;二进制不完整性&#xff1b;它将危害到其他的数据库&#xff1b;在从库过滤会占用过多的带宽,还会复制过多的跟数据库无关的内容主端:binlog-do-db:仅将指定数据库…

TreeMap是按照key的字典顺序来排序

一、TreeMap TreeMap 默认排序规则&#xff1a;按照key的字典顺序来排序&#xff08;升序&#xff09; 字典排序&#xff08;lexicographical order&#xff09;是一种对于随机变量形成序列的排序方法。即按照字母顺序&#xff0c;或者数字小大顺序&#xff0c;由小到大的形成…

Fireflow 终于发布啦!

Fireflow终于发布啦。虽然离工程应用还有一段距离&#xff0c;但是我还是想放出来让大家看看&#xff0c;听听大家的意见和建议。Fireflow的特点是模型和engine理论严密&#xff0c;因此可以在设计器中模拟流程的执行。另外Fireflow的系统设计也还可以的~_^文档还很欠缺&#x…

C语言攻略指南(五)数组篇

数组是指那些具有相同的数据类型的&#xff0c;数量有限的若干个变量通过有序的方法组织起来的一样种便于使用的形式。数组属于派生类型&#xff08;数组是建立在其他类型的基础上&#xff09;&#xff0c;数组中的变量被称为数组的元素。 一维数组 一维数组指的是只有一个下标…

java 虚类_java虚方法

java虚方法我们已经讨论了方法的重载&#xff0c;也就是子类能够重载父类的方法。以下是小编为大家搜索整理的java虚方法&#xff0c;欢迎大家阅读!更多精彩内容请及时关注我们应届毕业生考试网!当子类对象调用重载的方法时&#xff0c;调用的是子类的方法&#xff0c;而不是父…

windows下快速启动或关闭系统服务方法

在windows下有些后台服务会开机自动启动。 用命令行方式启动关闭应用服务 使用sc.exe命令功能列表 修改服务启动类型的命令行格式为&#xff08;特别注意start后面有一个空格&#xff09;    sc config 服务名称 start demand(设置服务为手动启动)     sc config 服务名…

我为什么fuck GFW同时FUCK 开心网

我很生气&#xff0c;后果很严重&#xff0c;你要问我为什么&#xff0c;那是因为GFW 屏蔽了一个对我有用的站点[url]www.github.com[/url]&#xff0c; 什么玩意&#xff08;省略1亿遍fuck 他们的话&#xff09;。 开心网删除我的日记&#xff0c; 并没用通知过我&#xff0c…

java 变量存放在哪_Java全局变量存放在哪里?

我们说 常量,静态变量存放在方法区中,方法中的临时变量,存放到Java 虚拟栈中。有人问,那全局变量*(对象)存放在哪里. 其实全局变量 就是参考文章中所说的class的字段,就是指全局变量,它是存放在方法区中的。e)方法区 与堆一样,是被线程共享的区域。在方法区中,存储了每…

中国网瘾群落调查

到底有多少青少年患上网瘾&#xff1f;答案是惊人的400万。在此前举行的全国人大常委会的会议上&#xff0c;全国人大常委会副委员长、秘书长李建国称&#xff0c;目前我国约4000万未成年网民中“网瘾少年”占10%左右&#xff0c;主要原因是迷恋网络游戏。华中师范大学教授、著…

从头认识Spring-1.7 如何通过属性注入Bean?(1)-如何通过属性向对象注入值?...

这一章节我们来讨论一下如何通过属性注入Bean&#xff1f;这一章节分为两部分&#xff0c;第一部分我们通过属性向对象注入值&#xff0c;第二部分我们通过属性向对象注入还有一个对象的引用。1.如何通过属性向对象注入值&#xff1f;&#xff08;1&#xff09;domainpackage c…