版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xiong9999/article/details/84869980
Java中ClassLoader与Class.forName的区别
package com.demo.classLoader;
public class Main {
public static void main(String[] args) {
getClassLoaderParent();
forName1();
forName2();
forName3();
}
/**
* @Title: getClassLoaderParent
* @Date: 2018-12-07 9:31
* @Description: 类加载时的加载器,AppClassLoader->ExtClassLoader->null(BootstrapClass)
*/
private static void getClassLoaderParent() {
ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
System.out.println("classLoader:\t" + systemClassLoader);
ClassLoader parent1 = systemClassLoader.getParent();
System.out.println("parent1:\t" + parent1);
ClassLoader parent2 = parent1.getParent();
System.out.println("parent2:\t" + parent2);
}
/**
* @Title: forName1
* @Date: 2018-12-07 9:41
* @Description: 执行时,将类加载到JVM中,同时执行类中的static代码块,对类的实例对象做初始化
*/
private static void forName1() {
try {
System.out.println("before forName1");
Class<?> aClass = Class.forName("com.demo.classLoader.DemoClass");
System.out.println("after forName1");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
/**
* @Title: forName2
* @Date: 2018-12-07 9:43
* @Description: 在同一个JVM中,一个类的实例对象只有一个,也就是说该类中的static代码块在类加载时就执行了,而且只执行一次
*/
private static void forName2() {
try {
System.out.println("before forName2");
Class<?> aClass1 = Class.forName("com.demo.classLoader.DemoClass", true, Main.class.getClassLoader());
System.out.println("after forName2");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
/**
* @Title: forName3
* @Date: 2018-12-07 9:44
* @Description: 类的加载方式是通过获取当前类的ClassLoader的父类,进行加载(双亲委派)
*/
private static void forName3() {
try {
System.out.println("before forName3");
Class<?> aClass2 = ClassLoader.getSystemClassLoader().loadClass("com.demo.classLoader.DemoClass");
System.out.println("after forName3");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
class DemoClass {
private DemoClass(String s) {
System.out.println("Constructor " + s);
}
static {
System.out.println("static DemoClass");
}
}