ClassLoader
2023-04-05 23:36:50 0 举报
AI智能生成
JVM双亲委派机制源码解析
作者其他创作
大纲/内容
java.lang.ClassLoader
protectedClass>loadClass(Stringname,booleanresolve)throwsClassNotFoundException
synchronized(getClassLoadingLock(name))
//首先检查该类是否已经被加载过
Class>c=findLoadedClass(name);
if(c==null){
//如果该类还没有被加载过,则委托给父类加载器进行加载
if(parent!=null){
try{
c=parent.loadClass(name,false);
}catch(ClassNotFoundExceptione){
}
}
//如果父类加载器无法加载该类,则调用自身的findClass方法进行加载
if(c==null){
c=findClass(name);
}
}
//如果需要解析类,则调用resolveClass方法进行解析
if(resolve){
resolveClass(c);
}
returnc;
protectedClass>findClass(Stringname)throwsClassNotFoundException
thrownewClassNotFoundException(name);
protectedClass>findLoadedClass(Stringname)
returnnull;
protectedObjectgetClassLoadingLock(StringclassName)
Objectlock=this;
if(parallelLockMap!=null){
lock=parallelLockMap.get(className);
if(lock==null){
lock=newObject();
parallelLockMap.putIfAbsent(className,lock);
}
}
returnlock;
java.lang.Class
protectedClass>forName(Stringname,booleaninitialize,ClassLoaderloader)throwsClassNotFoundException
Class>c=null;
if(loader==null){
try{
//如果没有指定类加载器,则使用系统类加载器进行加载
loader=ClassLoader.getSystemClassLoader();
}catch(SecurityExceptionse){
}
}
//使用指定的类加载器进行加载
if(loader!=null){
try{
c=loader.loadClass(name);
}catch(ClassNotFoundExceptione){
}
}
//如果无法使用指定的类加载器进行加载,则使用当前类的类加载器进行加载
if(c==null){
c=Class.forName(name,false,getClassLoader());
}
//如果需要初始化类,则调用initialize方法进行初始化
if(initialize){
initialize(c);
}
returnc;
java.security.SecureClassLoader
protectedfinalClass>defineClass(Stringname,byte[]b,intoff,intlen,CodeSourcecs)throwsClassFormatError
return defineClass(name,b,off,len)
0 条评论
下一页