`

类的加载方法:Class.forName与ClassLoader.loadClass

    博客分类:
  • Java
阅读更多

 Class.forNameClassLoader.loadClass方法都用来动态的加载一个类(都返回一个java.lang.Class对象),区别在于他们使用的ClassLoader和是否执行类的初始化。

1.1      Class.forName

这是一个类方法,该方法除了加载类到JVM中,还会执行类的初始化,即类的静态初始化。

 

使用Class.forName最常用的形式是Class.forName(String qualifiedClassName) 如写JDBC程序常用到的加载某个数据库Driverjvm的代码:

Class.forName("com.mysql.jdbc.Driver");

该函数使用调用者的ClassLoader, 即调用该行代码的类所使用的ClassLoader,返回一个参数名所对应的Class对象。

另外还有一个带三个参数的forName方法, Class.forName(String, boolean, ClassLoader),参数分别用来指定类名,是否初始化和要使用的ClassLoader

1.2      ClassLoader.loadClass

这是一个实例方法,可以使用一个特定的ClassLoader来加载一个类。该方法不会执行类的初始化,只由当该类第一次被使用时才会执行类的初始化,比如调用该类的一个静态方法或创建该类的一个对象。

1.3      使用哪一个方法

1.3.1       ClassLoader

不同的ClassLoader加载类时会从不同的位置来查找类的.class文件,所以如果要加载的类不在默认的查找位置时,就应该指定要使用的ClassLoader,否则会得到java.lang.ClassNotFoundException的错误。为了灵活性,你应该总是提供一个来参数指定ClassLoader而不是使用默认的ClassLoader,即使用带三个参数的forNameloadClass方法。关于不同的ClassLoader如何查找及加载类请参考ClassLoder一文。

1.3.2       是否要执行类初始化

在上面加载Mysql Driver的例子中,我们本身并不需要创建MySqlDriver对象,只需要加载DriverJVM,并执行类的初始化(可能执行注册自己到Driver Manger的代码)。所以可以使用forName方法,如果使用ClassLoader.loadClass则需要像下面这样:

ClassLoader cl = …;

cl.loadClass("com.mysql.jdbc.Driver").newInstance(); //创建对象仅仅为了执行类初始化,对象本身并不会被使用。

 

如果已知类的初始化是一个比较耗时的过程,则可以将其初始化推迟到该类被一次使用时。另外执行类的初始化代码失败会抛出java.lang.ExceptionInInitializerError异常。此时加载的类就变得不可用。类的初始化错误往往很难跟踪,所以如果要在一个特定点捕获并处理该异常就可以使用Class.forName并放在一个try块中。但是不要试图重新加载该类,因为一个类只能被同一个ClassLoader加载一次。

 

1.4      参考:

[ldcs] http://www.javaworld.com/javaworld/javaqa/2003-03/01-qa-0314-forname.html?page=1. 2003.03

 

 

 

分享到:
评论

相关推荐

    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

    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包即可

    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

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

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

    Java 基础面试题

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

    疯狂java讲义

    疯狂java讲义 源代码** * Description: ... * Program Name: * Date: ... * @version 1.0 */ class Tester ... System.out.println("Tester类的静态初始化块...");... Class.forName("Tester"); } }

    大数据面试题.pdf

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

    sarras:通过Java应用程序的静态和动态分析为Graal基板VM反射配置文件生成器

    作为Java代理附加到常规Java应用程序(不是来自本机映像),并拦截反射调用(还包括Class.forName(...)和ClassLoader.loadClass(...)调用)。 因此,它可以在运行时收集有关通过反射访问/引用哪些类/方法/字段的信息...

    带注释的Bootstrap.java

    private ClassLoader createClassLoader(String name, ClassLoader parent) throws Exception { //CatalinaProperties解析$CATALINA_HOME\conf\catalina.properties, //并将catalina.properties内的属性存为...

    Apache Geronimo 2.1_ Quick Reference.pdf

    Load balancing with Apache web server 310 Installing the Apache web server 310 Web app in Geronimo served through Apache web server 310 Apache HTTP portlet 311 Accessing the sample app through ...

Global site tag (gtag.js) - Google Analytics