java中class.forName和classLoader都可用来对类进行加载。前者除了将类的.class文件加载到jvm中之外,还会对类进行解释,执行类中的static块。而classLoader只干一件事情,就是将.class文件加载到jvm中,不会执行static中的内容,只有在newInstance才会去执行static块(网上有很多文章说,static块在类第一次被加载是执行,是错误的,比如这个人的博客:https://yq.aliyun.com/articles/58333)。

我们可以通过一个小例子来验证一下:

class MyClass1 {static {//静态块System.out.println("static block ");}
}
public class Main {Class[] classArray = {MyClass1.class//这样引用该类,必然需要将该类加载到虚拟机中
    };public static void main(String[] args){System.out.println("hello word");}}

执行结果:并没有输出" static bolck"

Class.forName(name, initialize, loader)带参函数也可控制是否加载static块。并且只有调用了newInstance()方法采用调用构造函数,创建类的对象 。比如:

Static Class forName(String name, boolean initialize, ClassLoader loader)

将 initialize 设定为 false,这样在加载类时并不会立即运行静态区块,而会在使用类建立对象时才运行静态区块。

其实当你调用Class.forName("classname")的时候相当于:

Class.forName("classname",true,this.getClass().getClassLoader());

  什么情况下使用class.forname?

  在一些应用中,无法事先知道使用者将加载什么类,而必须让使用者指定类名称以加载类,可以使用 Class 的静态 forName() 方法实现动态加载类。下面的范例让你可以指定类名称来获得类的相关信息。例如我们最熟悉的数据库驱动就是通过显示的class.forname来夹在数据库驱动类的,因为jvm启动的时候根本不知道你需要加在mysql的驱动包还是sqlserver的数据库驱动包。

/* 连接mysql 时装载的驱动类以及连接字符串 */
Class.forName(“com.mysql.jdbc.Driver”);//1
DriverManager.getConnection(“jdbc:mysql://localhost:3306/test”,”root”,”123”);//2
/* 连接SQLServer2005 时装载的驱动类以及连接字符串 */
Class.forName(“com.microsoft.sqlserver.jdbc.SQLServerDriver”);
DriverManager.getConnection(“jdbc:sqlserver://localhost:1433;databaseName=pubs”,”sa”, ””);

引用:http://blog.csdn.net/u011202334/article/details/51497998

    http://blog.csdn.net/berber78/article/details/46472789

转载于:https://www.cnblogs.com/guazi/p/6491378.html

java中class.forName和classLoader加载类的区分相关推荐

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

    一.类加载过程 装载:通过累的全限定名获取二进制字节流,将二进制字节流转换成方法区中的运行时数据结构,在内存中生成Java.lang.class对象:    链接:执行下面的校验.准备和解析步骤,其中 ...

  2. ClassLoader加载类时序图及Qzon修复流程图

    很少画UML时序图,有点难顶 ClassLoader加载类时序图,parent.loadClass()处为循环,不知道这样画对不对 Qzon修复流程图

  3. java 找不到或无法加载类_解决Java中找不到或无法加载主类错误

    场景: 使用java命令运行.class文件时出现:"错误: 找不到或无法加载主类": 原因: 1.java指令默认在寻找class文件的地址是通过CLASSPATH环境变量中指定 ...

  4. 使用forName动态加载类文件

    动态加载(Dynamic Loading)是指在程序运行时加载需要的类库文件,对Java程序来说,一般情况下,一个类文件在启动时或首次初始化时会被加载到内存中,而反射则可以在运行时再决定是否需要加载一 ...

  5. 图解classloader加载class的流程及自定义ClassLoader

    http://longdick.iteye.com/blog/442213 java应用环境中不同的class分别由不同的ClassLoader负责加载. 一个jvm中默认的classloader有B ...

  6. java中class.forname连接mysql数据库_数据库链接与 Class.forName()用法详解

    主要功能 Class.forName(xxx.xx.xx)返回的是一个类 Class.forName(xxx.xx.xx)的作用是要求JVM查找并加载指定的类, 也就是说JVM会执行该类的静态代码段 ...

  7. java类加载器可以从互联网加载,Java类加载器深入解析(2)

    在做Java开发时了解Java类加载机制是非常好的.而对类加载机制的基本理解对Java开发人员处理类加载器(ClassLoader)相关的异常也很有帮助. 类加载器委托机制 Java类的装载是通过类加 ...

  8. java重新加载类_java重新加载类的探寻

    java重新加载类的探寻 首先上结论:java类加载器不支持重新加载类.如果想重新加载,那就新建一个类加载器. 接下来慢慢讲: 项目背景 在近日做的一个项目中,有一个动态获取用户输入的代码,并进行运行 ...

  9. java web 加载类_Java中用ClassLoader载入各种资源(类、文件、web资源)的方法

    lassLoader主要对类的请求提供服务,当JVM需要某类时,它根据名称向ClassLoader要求这个类,然后由ClassLoader返回这个类的class对象. ClassLoader负责载入系 ...

  10. Java的ClassLoader加载是怎么保证安全的?

    点击上方蓝色字体,选择"标星公众号" 优质文章,第一时间送达 1.类加载机制 Java中的源码.java后缀文件会在运行前被编译成.class后缀文件,文件内的字节码的本质就是一个 ...

最新文章

  1. 百度李彦宏:无人驾驶何时商用
  2. linux定时导出数据库,linux 下定时导出备份oracle数据库
  3. 对勾函数_对勾函数?2020福建省中考压轴题分析
  4. 福布斯中国2018年30位30岁以下精英榜单发布,为什么是他们?
  5. java integer_Java之Integer类
  6. 百度 自然语言处理API
  7. Halcon 一维测量
  8. yield return 和 Func
  9. Android 使用低功耗蓝牙简单介绍
  10. host速度 mtk usb_MTK功能机MT2503平台USB充电电流设置
  11. Turbo C程序中点阵汉字库和曲线汉字库的显示
  12. 免费直播系统源码,可控的跑马灯,无需焦点
  13. python远程调用摄像头_教你如何利用python调用摄像头
  14. Vue_(基础)Vue中的事件
  15. 河北省对口升学计算机专业学校,河北省对口升学计算机专业试题详解
  16. Android 知识点 108 —— PowerManagerService
  17. Linux下的dd和cat
  18. linux开机自启jar包
  19. 苹果股价两月累计跌25% 市值跌破5000亿
  20. 国科大学习资料--最优化计算方法(王晓)--第七次作业答案

热门文章

  1. 375.猜数字大小II
  2. 15投影矩阵与Moore-Penrose逆(2)
  3. c语言 异或_C语言位逻辑运算符的四种逻辑:取反,并,或,异或
  4. centos tomcat部署
  5. Cobalt Strike参数详解
  6. 2020牛客多校训练1 I 1or2(拆点拆边带花树一般图最大匹配)
  7. java读取配置文件的详细写法,Properties配置文件读取相关java知识
  8. 2021年浏阳市五中高考成绩查询,浏阳市2021年“三考”增加考生万余名
  9. 三个点在同一个半圆的概率_圆形水池中的四只小鸭子出现在同一个半圆中的概率是?...
  10. springboot批量更新实体_springboot使用druid批量更新报错