java.lang.Class获取类装载器的过程
/**
* 返回此类的ClassLoader
* 如果此类(例如java.lang.String)是由bootstrap ClassLoader装载的返回null
* 原始类型返回null
* 如果Class对象表示的是数组,则获得的ClassLoader是元素的ClassLoader
* 例如:
* 1(new Test[10]).getClass().getClassLoader()返回null,因为元素是原始类型
* 2(new String[10]).getClass().getClassLoader()返回null,因为String
* 是由bootstrap ClassLoader装载的
* 3(new Test[10]).getClass().getClassLoader()
* 返回sun.misc.Launcher$AppClassLoader@e2eec8,Test是自定义的类
*
*/
public ClassLoader getClassLoader() {
ClassLoader cl = getClassLoader0();
if (cl == null)
return null;
SecurityManager sm = System.getSecurityManager();
if (sm != null) {
ClassLoader ccl = ClassLoader.getCallerClassLoader();//获得调用者的类装载器
//如果调用对象的类不是是由bootstrap ClassLoader,并且当前对象的类
//与调用对象的类不是由同一类装载器装载,且当前对象的ClassLoader不是调用
//对象的ClassLoader的上层(ClassLoader链结构的上层),则进行安全检查
if (ccl != null && ccl != cl && !cl.isAncestor(ccl)) {
sm.checkPermission(SecurityConstants.GET_CLASSLOADER_PERMISSION);
}
}
return cl;
}
// Package-private to allow ClassLoader access
native ClassLoader getClassLoader0();