java如何加载class文件

java文件的类加载机制:

jvm将描述类的数据从class文件加载到内存,然后对数据进行校验,解析以及初始化,在java虚拟机中形成可以直接使用的java类型。

java类文件的加载是动态的。

java为我们提供了2种类文件加载的动态机制。

1.隐式加载---- new一个对象+调用一个类的静态方法

2.显示加载----(1)java.lang.Class的forName方法加载

                      (2)java.lang.ClassLoad的loadClass方法加载

接下来我们来比较下显示加载的2个方法:

1.java.lang.Class的forName方法加载

class.forName 有2个重载方法

  • public static Class forName(String className)
  • public static Class forName(String className, boolean initialize,ClassLoader loader)​​​​​​​

className: 类的完全限定名

initialize:是否初始化类(初始化类中的静态代码块)

loader:加载类的类加载器

说明:
调用forName(className) 相等于forName(className, true,loader)

这两个方法最终都会走到

  • private static native Class<?> forName0(String name, boolean initialize,
                                            ClassLoader loader,
                                            Class<?> caller)

这个方法里。

1.java.lang.ClassLoad的loadClass方法加载

  • Classloder.loaderClass(String name)

方法内部调用的是:Classloder. loadClass(name, false)

方法:Classloder. loadClass(String name, boolean resolve)

1:参数name代表类的全限定类名

2:参数resolve代表是否解析,resolve为true是解析该类

两者最大的区别:class.forName 得到的class是已经初始化的,而Classloder.loaderClass是还没有链接的。

最常用的就是:mysql驱动器的加载

Class.froName(“com.mysql.jdbc.Driver”),

看看源码就知,在获取Driver时,需要初始化静态代码块

public class Driver extends NonRegisteringDriver implements java.sql.Driver {
 
    public Driver() throws SQLException {
 
    } <br>
    static {
        try {
            DriverManager.registerDriver(new Driver());
        } catch (SQLException var1) {
            throw new RuntimeException("Can\'t register driver!");
        }
    }
}

 

​​​​​​​​​​​​​​​​​​​​​


版权声明:本文为sinat_24041961原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。