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
java中class.forName和classLoader加载类的区分的更多相关文章
- [置顶] java 通过classloader加载类再通过classforname实例化
自己写一个web服务器,发现class.forName用不了,找不到类,原因是找不到类路径, 可以过加载需要的类的文件路径,然后再通过ClassLoader来加载所需要的类.其中的原 理就不多说了,下 ...
- (转)面试题--JAVA中静态块、静态变量加载顺序详解
public class Test { //1.第一步,准备加载类 public static void main(String[] args) { new Test(); //4.第四步,new一个 ...
- 面试题--JAVA中静态块、静态变量加载顺序
最后给大家一道面试题练练手,要求写出其结果(笔试) public class StaticTest { public static int k = 0; public static StaticTes ...
- JAVA中静态块、静态变量加载顺序详解
http://blog.csdn.net/mrzhoug/article/details/51581994 一般顺序:静态块(静态变量)——>成员变量——>构造方法——>静态方法
- [改善Java代码]使用forName动态加载类文件
动态加载(Dynamic Loading)是指在程序运行时加载需要的类库文件,对Java程序来说,一般情况下,一个类文件在启动时或首次初始化时会被加载到内存中,而反射则可以在运行时再决定是否需要加载一 ...
- Java ClassLoader加载机制理解
今天看到了一篇介绍Java ClassLoader加载机器的文章, 才发觉一直来自己的肤浅, 好好地给补了一课, 不得不存档! 原文地址: http://www.blogjava.net/lhulcn ...
- Java中Class.forName()的作用(转载)
http://www.360doc.com/content/10/0712/10/1720440_38421273.shtml# 使用jdbc方式连接数据库时会使用一句代码Class.forName( ...
- 图解classloader加载class的流程及自定义ClassLoader
图解classloader加载class的流程及自定义ClassLoader 博客分类: JVM JavaJVM虚拟机EXTSUN /** * 转载请注明作者longdick http://l ...
- classloader加载过程
/** * 转载请注明作者longdick http://longdick.iteye.com * */ java应用环境中不同的class分别由不同的ClassLoader负责加载. 一个j ...
随机推荐
- react-router 4.0 升级攻略
react-router 4.0 出来好9了,项目在4月份的时候对react-router进行了升级,升级耗费了3天,一个坑一个坑踩了过来. 按照公司项目情况说下升级改了哪些,项目使用的是hashHi ...
- Monty Hall悖论
Monty Hall悖论又称为蒙提·霍尔悖论.三门问题.Monty Hall是上个世纪60年代,电视游戏节目“Let's Make a Deal”的主持人,这个悖论便是以他的名字来命名的.节目的规则是 ...
- JavaScript中字符串分割函数split用法实例
这篇文章主要介绍了JavaScript中字符串分割函数split用法,实例分析了javascript中split函数操作字符串的技巧,非常具有实用价值,需要的朋友可以参考下 本文实例讲述了JavaSc ...
- 洛谷P1414 又是毕业季 [数论]
题目传送门 又是毕业季 题目背景 “叮铃铃铃”,随着高考最后一科结考铃声的敲响,三年青春时光顿时凝固于此刻.毕业的欣喜怎敌那离别的不舍,憧憬着未来仍毋忘逝去的歌.1000多个日夜的欢笑和泪水,全凝聚在 ...
- 洛谷P1565牛宫
传送门:题目点这里; 首先理解题目,就是要求给定矩阵中权值和不小于零的最大子矩阵,数据范围200也还不算棘手,暴力n^4的算法也可以水到50分.正解要用到单调栈配合二分和前缀和,复杂度n^3logn, ...
- 多进程失败拉起的demo
#include <iostream> #include <vector> #include <unistd.h> #include <stdlib.h> ...
- [BZOJ4898] [Apio2017]商旅
[BZOJ4898] [Apio2017]商旅 传送门 试题分析 考虑两个点之间的路径,显然如果交易的话肯定选\(S_{t,i}-B_{s,i}\)最大的. 那么我们可以先用\(Cost\)把两个点的 ...
- 【高精度】【找规律】Gym - 101243B - Hanoi tower
题意:给你一个经典的汉诺塔递归程序,问你最少几步使得三个柱子上的盘子数量相同.(保证最开始盘子数量可以被3整除) 规律:ans(n)=2^(2*n/3-1)+t(n/3). t(1)=0. t(n)= ...
- 【KMP模板】POJ3461-Oulipo
[题意] 找出第一个字符串在第二个字符串中出现次数. [注意点] 一定要先将strlen存下来,而不能每次用每次求,否则会TLE! #include<iostream> #include& ...
- 装载 | Eclipse中搭建最新版本的Android开发环境
文章目录 准备工作 下载文件 下载JDK并配置系统变量环境 下载安装Eclipse 下载Android SDK 下载ADT插件 使用下载好的软件搭建Android开发环境 安装Android的SDK ...