- ClassLoader & 双亲委派
- URLClassLoader
- SPI(Service Provider Interface)
ClassLoader & 双亲委派
| ClassLoader | 编程语言 | 加载内容 | Parent ClassLoader | |
|---|---|---|---|---|
| BootstrapClassLoader | C++ | jre/lib;jre/classes | Null | Java虚拟机启动后初始化 |
| ExtClassLoader | Java | jre/lib/ext;java.ext.dirs | BootstrapClassLoader | |
| AppClassLoader | Java | classpath指定位置 | ExtClassLoader | ClassLoader.getSystemClassLoader 返回值 |
ClassLoader的基本模型:
URLClassLoader
- ClassLoader.loadClass
- URLClassLoader.findClass
- ExtClassLoader & AppClassLoader 的URLClassPath
ClassLoader.loadClass
protected Class<?> loadClass(String name, boolean resolve)
throws ClassNotFoundException
{
synchronized (getClassLoadingLock(name)) {
// First, check if the class has already been loaded
Class<?> c = findLoadedClass(name);
if (c == null) {
try {
if (parent != null) {
c = parent.loadClass(name, false);
} else {
c = findBootstrapClassOrNull(name);
}
} catch (ClassNotFoundException e) {
// ClassNotFoundException thrown if class not found
// from the non-null parent class loader
}
if (c == null) {
// If still not found, then invoke findClass in order
// to find the class.
c = findClass(name);
}
}
if (resolve) {
resolveClass(c); }
return c;
}
}
// ClassLoader method
protected Class<?> findClass(String name) throws ClassNotFoundException {
throw new ClassNotFoundException(name);
}
其中findClass是关键:一来没有具体实现,二来修饰符是protected,所以 很明显是为了“开闭”。
URLClassLoader.findClass
// URLClassLoader overwrite
protected Class<?> findClass(final String name)
throws ClassNotFoundException
{
final Class<?> result;
try {
result = AccessController.doPrivileged(
new PrivilegedExceptionAction<Class<?>>() {
public Class<?> run() throws ClassNotFoundException {
String path = name.replace('.', '/').concat(".class");
Resource res = ucp.getResource(path, false)

本文介绍了Java中的ClassLoader和双亲委派机制,详细讲解了URLClassLoader的工作原理,包括loadClass和findClass方法。接着探讨了SPI(Service Provider Interface)服务发现机制,解释了为何BootstrapClassLoader和ExtClassLoader无法加载MySQL驱动,并通过ServiceLoader的使用展示了SPI的实现原理。文章最后提到了ServiceLoader的使用步骤和SPI的应用实例。

最低0.47元/天 解锁文章
3114

被折叠的 条评论
为什么被折叠?



