首页 > 编程语言 >Java中Class.forName和 ClassLoader.loadClass()区别

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

时间:2023-02-14 11:07:36浏览次数:44  
标签:初始化 forName Java loadClass Class class 加载


一、类加载过程

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块。

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

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

标签:初始化,forName,Java,loadClass,Class,class,加载
From: https://blog.51cto.com/u_15258465/6056147

相关文章

  • java中的HashSet内部是如何工作的
    HashSet的内部采用HashMap来实现。由于Map需要key和value,所以HashSet中所有key的都有一个默认value。类似于HashMap,HashSet不允许重复的key,只允许有一个nullke......
  • javascript Date日期类
     四、Date日期类迁移时间:2017年5月27日18:43:02Author:Marydon(一)对日期进行格式化(日期转字符串)自定义Date日期类的format()格式化方法方式一:(非原创)//......
  • Java POI导出excel经典实现-交叉报表斜表头
    Java使用poi组件导出excel报表,能导出excel报表的还可以使用jxl组件,但jxl想对于poi功能有限,jxl应该不能载excel插入浮动层图片,poi能很好的实现输出excel各种功能,介绍poi导出e......
  • JMeter java模拟多用户高并发请求测试(json,form表单)
     1.情景展示在实际开发过程中,需要进行测试的时候,往往需要进行压力测试,或者高并发情况下,同时对一张表数据进行修改、读取操作,程序会不会出现多个用户取出的数据一致,或者......
  • Java redisTemplate阻塞式处理消息队列
    +目录Redis消息队列redis五种数据结构队列生产者123456789101112131415161718192021222324252627282930313233......
  • Java8新特性5-流Stream
    Stream是Java8中引入的全新API,位于java.util.stream包下,它与java.io包下的InputStream和OutputStream等输入输出流是完全不同的概念;Java8中的Stream是对数组、......
  • java圆柱面积体积 scanner
    importjava.util.Scanner;publicclasshello{publicstaticvoidmain(String[]args){System.out.println("输入半径");Scannerscanner=newS......
  • JavaScript 数字是什么?
    本文首发自「慕课网」,想了解更多IT干货内容,程序员圈内热闻,欢迎关注!作者|慕课网精英讲师然冬基于IEEE754标准的双精度64位二进制格式的值(-(253-1)到253-1)。——MDN......
  • 用java代码实现迁移数据库数据
    缺点需要另外同步表结构到目标数据库代码importjava.sql.*;publicclassEsqTableController{publicstaticvoidmain(String[]args)throwsSQLExceptio......
  • 【开发宝典】Java并发系列教程
    作者:京东零售刘跃明Monitor概念Java对象的内存布局对象除了我们自定义的一些属性外,还有其它数据,在内存中可以分为三个区域:对象头、实例数据、对齐填充,这三个区域组成起......