Class.forName 与ClassLoader.loadClass

Java 中动态加载类的两种方式  Class.forName 与ClassLoader.loadClass

先定义A类

package test;

public class A {
	public void test() {
		System.out.println("This is Class a Test");
	}
}



然后是相关测试类

package test;

public class ClassLoadTest {

	public static void main(String[] args) throws ClassNotFoundException,
			InstantiationException, IllegalAccessException {
		ClassLoader classLoader = new ClassLoader() {
		};

		@SuppressWarnings("unchecked")
		Class<A> clazz = (Class<A>) classLoader.loadClass("test.A");
		A a = (A) clazz.newInstance();
		a.test();

		@SuppressWarnings("unchecked")
		Class<A> clazz2 = (Class<A>) ClassLoader.getSystemClassLoader()
				.loadClass("test.A");
		A a2 = (A) clazz2.newInstance();
		a2.test();

		@SuppressWarnings("unchecked")
		Class<A> clazz3 = (Class<A>) Class.forName("test.A");
		A a3 = (A) clazz3.newInstance();
		a3.test();

	}

}



两者的区别:
Class.forName是从指定的classloader中装载类,如果没有指定,也就是一个参数的时候,是从装载当前对象实例所在的classloader中装载类.
而ClassLoader的实例调用loadclass方法,是指从当前ClassLoader实例中调用类,而这个实例与装载当前所在类实例的Classloader不是同一个.

举个例子吧, 有A,B,C 三个类 , 当前运行的类D的实例是d(装载它的是A) ,  如果D中使用Class.forName那么就是使用的ClassLoader就是A,当然,也可以指定为B. 而如果D中代码使用的ClassLoader实例是C,那么就是用D来装载所指定的类.


如果在Class被载入的过程中,你希望使用在自己的Class Loader来实现特定的操作,请使用ClassLoader方式

你可能感兴趣的:(java 基础)