`

详解Class.forName和ClassLoader.loadClass的比较

 
阅读更多

Class的装载分了三个阶段,loading,linking和initializing,分别定义在The Java Language Specification的12.2,12.3和12.4。
Class.forName(className)实际上是调用Class.forName(className, true, this.getClass().getClassLoader())。注意第二个参数,是指Class被loading后是不是必须被初始化。
ClassLoader.loadClass(className)实际上调用的是ClassLoader.loadClass(name, false),第二个参数指出Class是否被link。
区别就出来了。Class.forName(className)装载的class已经被初始化,而ClassLoader.loadClass(className)装载的class还没有被link。
一般情况下,这两个方法效果一样,都能装载Class。但如果程序依赖于Class是否被初始化,就必须用Class.forName(name)了。
例如,在JDBC编程中,常看到这样的用法,Class.forName("com.mysql.jdbc.Driver"),如果换成了getClass().getClassLoader().loadClass("com.mysql.jdbc.Driver"),就不行。
为什么呢?打开com.mysql.jdbc.Driver的源代码看看,
//
// Register ourselves with the DriverManager
//
static {
try {
java.sql.DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
}
原来,Driver在static块中会注册自己到java.sql.DriverManager。而static块就是在Class的初始化中被执行。所以这个地方就只能用Class.forName(className)。

本篇文章来源于 我爱编程网 转载请以链接形式注明出处 网址:http://www.bcw52.com/JAVA/2078.html

分享到:
评论

相关推荐

    liuwei1989#study-guide#17-Class.forName和classloader的区别1

    并且只有调用了newInstance()方法采用调用构造函数,创建类的对象看下Class.forName()源码//Class.forName(String c

    在Java的反射中,Class.forName和Class

    在Java的反射中,Class.forName和ClassLoader的区别共4页.pdf.zip

    jdbc--sqljdbc4-2.0.jar

    java链接sqlserver数据库包如下错误时: ... at java.net.URLClassLoader.findClass(Unknown ... at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Unknown Source) 添加sqljdbc4-2.0包即可

    resolver_java_wsdl.jar

    at java.lang.ClassLoader.loadClass(ClassLoader.java:667) at com.ibm.ws.bootstrap.ExtClassLoader.loadClass(ExtClassLoader.java:119) at java.lang.ClassLoader.loadClass(ClassLoader.java:650) at ...

    破解java加密的ClassLoader.java,在classloader植入破解代码

    破解java加密的ClassLoader.java,在classloader植入破解代码

    破解java加密的rt.jar,在classloader植入破解代码

    破解java加密的rt.jar,在classloader植入破解代码,默认输出到c:/TEMP/classes/目录。使用方法:只要下载本rt.jar,然后替换掉jdk1.8.0_25\jre\lib目录下的rt.jar。然后运行你需要破解的java程序即可,如果你的java...

    在可执行jar中载入第三方jar的几个解决方法

    开发完毕,部署的时候,将开发的class打成一个可执行jar包,会发现通过Class.forName(String classname) 或ClassLoader.getSystemClassLoader().loadClass(String classname)来动态载入存在于第三方jar包中的class会抛...

    ClassLoader

    Java 虚拟机中ClassLoader 相关简介 双亲委托机制 Android 中ClassLoader 简介

    aop面向切面需要的jar包

    at java.lang.ClassLoader.loadClass(ClassLoader.java:307) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) at java.lang.ClassLoader.loadClass(ClassLoader.java:252) at java.lang....

    hive-jdbc-2.1.0-standalone.jar

    at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Unknown Source) at com.trs.gateway.commons.hive.HiveFeature.getConnection(HiveFeature.java:55) ... 8 more

    hive-jdbc-1.1.0-cdh5.4.5-standalone.jar

    at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Unknown Source) at com.trs.gateway.commons.hive.HiveFeature.getConnection(HiveFeature.java:55) ... 8 more

    关于Classloader的总结!loadClass的分析和加载细节的分析

    NULL 博文链接:https://lz12366.iteye.com/blog/735289

    web_classloader_test.zip_web classloader

    web类加载器的小例子,可以供大家参考,谢谢!

    swing-worker-1.1.jar

    Exceptionin thread "AWT-EventQueue-0" java.lang.NoClassDefFoundError: org/... at java.lang.ClassLoader.loadClass(ClassLoader.java:307) at java.lang.ClassLoader.loadClass(ClassLoader.java:248) ...9 more

    ClassLoader 详解.doc

    关于J2EE服务器的ClassLoader的原理,该文档清晰了揭示了jvm装载类的顺序,同时用户可以自定义修改classLoader的配置 通过该文档,可以加深对Java虚拟机的理解

    android反编译dex2jar

    at java.lang.ClassLoader.loadClass(ClassLoader.java:306) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:276) at java.lang.ClassLoader.loadClass(ClassLoader.java:251) at java.lang....

    大数据面试题.pdf

    52 1-12)Java中Class.forName和ClassLoader.loadClass的区别 Class.forName("xx.xx")等同于Class.forName("xx.xx",true,CALLClass.class.getClassLoader()),第⼆个参数(bool)表⽰装载类的时候是否 初始化该类,即...

    com.springsource.oracle.classloader-10.1.3.1.jar

    jar包,官方版本,自测可用

    Java 基础面试题

    该文档主要整理了常见的Java基础面试题,包含以下内容: ...32. Class.forName()和ClassLoader.loadClass()的区别 34. 如何防止创建的类名不能java为已有类名,Java加载双亲委派机制 35. 堆和栈的区别

Global site tag (gtag.js) - Google Analytics