Java 关于 Class.forName(com.mysql.jdbc.Driver) 未遵守了双亲委派模型这件事有什么比较好资料么?
如何破坏的?
谢谢
如何破坏的?
谢谢
参考:
Class.forName 方法:
@CallerSensitive
public static Class<?> forName(String className)
throws ClassNotFoundException {
Class<?> caller = Reflection.getCallerClass();
return forName0(className, true, ClassLoader.getClassLoader(caller), caller);
}
可以看出是使用 ClassLoader.getClassLoader(caller) 类加载器进行加载的,默认是使用的用户类加载器,还是符合双亲委派机制的。
如有错误,请指出
如何破坏的?::
> SPI 机制
Driver 具体的实现类 jar 包在 META-INF/services/java.sql.Driver 文件里写上自己 Driver 实现类的全限定名, 比如 `org.postgresql.Driver` , JDK8 的 DriverManager 在 static 代码块里(JDK14 是在第一次 getConnection 时)会用 ServiceLoader 获取所有的 Driver 并使用 Thread.currentThread().getContextClassLoader() 获取到的 AppClassLoader 加载该类, Driver 实现类的 static 代码块会去调用 DriverManager::registerDriver 将自己注册到 DriverManager 里.
个人理解…