java中class.forName和classLoader加载类的区分
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加载类的区分相关推荐
- Java中Class.forName和 ClassLoader.loadClass()区别
一.类加载过程 装载:通过累的全限定名获取二进制字节流,将二进制字节流转换成方法区中的运行时数据结构,在内存中生成Java.lang.class对象: 链接:执行下面的校验.准备和解析步骤,其中 ...
- ClassLoader加载类时序图及Qzon修复流程图
很少画UML时序图,有点难顶 ClassLoader加载类时序图,parent.loadClass()处为循环,不知道这样画对不对 Qzon修复流程图
- java 找不到或无法加载类_解决Java中找不到或无法加载主类错误
场景: 使用java命令运行.class文件时出现:"错误: 找不到或无法加载主类": 原因: 1.java指令默认在寻找class文件的地址是通过CLASSPATH环境变量中指定 ...
- 使用forName动态加载类文件
动态加载(Dynamic Loading)是指在程序运行时加载需要的类库文件,对Java程序来说,一般情况下,一个类文件在启动时或首次初始化时会被加载到内存中,而反射则可以在运行时再决定是否需要加载一 ...
- 图解classloader加载class的流程及自定义ClassLoader
http://longdick.iteye.com/blog/442213 java应用环境中不同的class分别由不同的ClassLoader负责加载. 一个jvm中默认的classloader有B ...
- java中class.forname连接mysql数据库_数据库链接与 Class.forName()用法详解
主要功能 Class.forName(xxx.xx.xx)返回的是一个类 Class.forName(xxx.xx.xx)的作用是要求JVM查找并加载指定的类, 也就是说JVM会执行该类的静态代码段 ...
- java类加载器可以从互联网加载,Java类加载器深入解析(2)
在做Java开发时了解Java类加载机制是非常好的.而对类加载机制的基本理解对Java开发人员处理类加载器(ClassLoader)相关的异常也很有帮助. 类加载器委托机制 Java类的装载是通过类加 ...
- java重新加载类_java重新加载类的探寻
java重新加载类的探寻 首先上结论:java类加载器不支持重新加载类.如果想重新加载,那就新建一个类加载器. 接下来慢慢讲: 项目背景 在近日做的一个项目中,有一个动态获取用户输入的代码,并进行运行 ...
- java web 加载类_Java中用ClassLoader载入各种资源(类、文件、web资源)的方法
lassLoader主要对类的请求提供服务,当JVM需要某类时,它根据名称向ClassLoader要求这个类,然后由ClassLoader返回这个类的class对象. ClassLoader负责载入系 ...
- Java的ClassLoader加载是怎么保证安全的?
点击上方蓝色字体,选择"标星公众号" 优质文章,第一时间送达 1.类加载机制 Java中的源码.java后缀文件会在运行前被编译成.class后缀文件,文件内的字节码的本质就是一个 ...
最新文章
- 百度李彦宏:无人驾驶何时商用
- linux定时导出数据库,linux 下定时导出备份oracle数据库
- 对勾函数_对勾函数?2020福建省中考压轴题分析
- 福布斯中国2018年30位30岁以下精英榜单发布,为什么是他们?
- java integer_Java之Integer类
- 百度 自然语言处理API
- Halcon 一维测量
- yield return 和 Func
- Android 使用低功耗蓝牙简单介绍
- host速度 mtk usb_MTK功能机MT2503平台USB充电电流设置
- Turbo C程序中点阵汉字库和曲线汉字库的显示
- 免费直播系统源码,可控的跑马灯,无需焦点
- python远程调用摄像头_教你如何利用python调用摄像头
- Vue_(基础)Vue中的事件
- 河北省对口升学计算机专业学校,河北省对口升学计算机专业试题详解
- Android 知识点 108 —— PowerManagerService
- Linux下的dd和cat
- linux开机自启jar包
- 苹果股价两月累计跌25% 市值跌破5000亿
- 国科大学习资料--最优化计算方法(王晓)--第七次作业答案
热门文章
- 375.猜数字大小II
- 15投影矩阵与Moore-Penrose逆(2)
- c语言 异或_C语言位逻辑运算符的四种逻辑:取反,并,或,异或
- centos tomcat部署
- Cobalt Strike参数详解
- 2020牛客多校训练1 I 1or2(拆点拆边带花树一般图最大匹配)
- java读取配置文件的详细写法,Properties配置文件读取相关java知识
- 2021年浏阳市五中高考成绩查询,浏阳市2021年“三考”增加考生万余名
- 三个点在同一个半圆的概率_圆形水池中的四只小鸭子出现在同一个半圆中的概率是?...
- springboot批量更新实体_springboot使用druid批量更新报错