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方式