loadClass和forName的区别
loadClass
package java.lang;
public abstract class ClassLoader {
public Class<?> loadClass(String name) throws ClassNotFoundException {
return loadClass(name, false);
}
protected Class<?> loadClass(String name, boolean resolve)
throws ClassNotFoundException
{
synchronized (getClassLoadingLock(name)) {
// First, check if the class has already been loaded
...
}
//默认为false
if (resolve) {
resolveClass(c);
}
return c;
}
}
/**
链接指定的类。 此(误称)方法可能是
由类加载器用来链接类。 如果班上有
已经链接,则此方法仅返回。 否则,
类的链接如“开发”一章中所述
Java语言规范
*/
protected final void resolveClass(Class<?> c) {
if (c == null) {
throw new NullPointerException();
}
}
loadClass只加载,不进行链接
forName
@CallerSensitive
public static Class<?> forName(String className)
throws ClassNotFoundException {
Class<?> caller = Reflection.getCallerClass();
return forName0(className, true, ClassLoader.getClassLoader(caller), caller);
}
//initialize 为true
forName不光加载,还会进行链接,但不会进行初始化
Object.class.forName("…").getDeclaredConstructor().newInstance();
newInstance进行初始化