类加载器(ClassLoader),顾名思义,即加载类的东西。

在我们使用一个类之前,JVM需要先将该类的字节码文件(.class文件)从磁盘、网络或其他来源加载到内存中,并对字节码进行解析生成对应的Class对象,这就是类加载器的功能。我们可以利用类加载器,实现类的动态加载。

class的装载包括3个步骤:加载(loading),连接(link),初始化(initialize)

1、由new关键字创建一个类的实例
在由运行时刻用 new 方法载入
例:Person person = new Person();
2、使用Class.forName()
通过反射加载类型,并创建对象实例
例:Class clazz = Class.forName(“Person”);
Object person =clazz.newInstance();
3、使用某个ClassLoader实例的loadClass()方法
通过该 ClassLoader 实例的 loadClass() 方法载入。应用程序可以通过继承 ClassLoader 实现自己的类装载器。
例:Class clazz = classLoader.loadClass(“Person”);
Object person =clazz.newInstance();

区别:

1和2使用的类加载器是相同的,都是当前类加载器(即:this.getClass.getClassLoader)。
3由用户指定类加载器。如果需要在当前类路径以外寻找类,则只能采用第3种方式。即第3种方式加载的类与当前类分属不同的命名空间。

1是静态加载、2、3是动态加载

异常(exception)

静态加载的时候如果在运行环境中找不到要初始化的类,抛出的是NoClassDefFoundError,它在JAVA的异常体系中是一个Error;

动态态加载的时候如果在运行环境中找不到要初始化的类,抛出的是ClassNotFoundException,它在JAVA的异常体系中是一个checked异常。

从JVM的角度看,我们使用关键字new创建一个类的时候,这个类可以没有被加载。但是使用Class对象的newInstance()方法的时候,就必须保证:1.这个类已经加载;2.这个类已经连接了。

new关键字和newInstance()方法的区别:

newInstance:弱类型,低效率,只能调用无参构造;
new:强类型,相对高效,能调用任何Public构造。

初始化:只有在使用时类才会被初始化。

1 初始化,也就是new时候会初始化类

2 访问类或者接口中的静态变量或者对其赋值

3 调用类的静态方法

4 反射(Class.forName("com.geminno");)

5 初始化它的子类,父类也会初始化

6 虚拟机启动时被标明是启动类的类(java Test),直接用java.exe运行某个类;

程序执行结束的几种方式:

1 system.exit();

2 正常执行完毕;

3 程序运行错误,报错

4 系统出现问题,虚拟机停止运行;