博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Class.forName("xxx")调用过程
阅读量:6292 次
发布时间:2019-06-22

本文共 2789 字,大约阅读时间需要 9 分钟。

hot3.png

问题:java.lang.ClassNotFoundException

1.Class.forName("xxx")作用概述

    xxx:字符串,表示要装载的类名或者是驱动名字。

   Class.forName()的主要作用是将“xxx”表示的类装载到JAVA虚拟机中。

2.Class.forName("xxx")具体加载过程

    解决的问题:

  •          “xxx”表示类的字节码应该放在哪里?
  •         Class.forName("xxx")调用过程的相关的类、对象和系统环境?
  •         设计Class.forName("xxx")的意义?

2.1 Class.forName("xxx")寻找过程细节?

     这里主要解决前两个问题—— “xxx”表示类的字节码应该放在哪里?和Class.forName("xxx")调用过程的相关的类、对象和系统环境?

java.sql.DriverManager.registerDriver(new Driver());【1】

在这篇博文中,表示java.sql.DriverManager是在Class.forName("xxx")中的xxx类放入内存后,才静态注册驱动类。但是JVM如何将xxx放入内存呢?下面是Class类中forName()的源代码

    public static Class
forName(String className)                throws ClassNotFoundException {        return forName0(className, true, ClassLoader.getCallerClassLoader());    }
 private static native Class
forName0(String name, boolean initialize,                                            ClassLoader loader)        throws ClassNotFoundException;

    public static Class
forName(String name, boolean initialize,                                   ClassLoader loader)        throws ClassNotFoundException    {        if (loader == null) {            SecurityManager sm = System.getSecurityManager();            if (sm != null) {                ClassLoader ccl = ClassLoader.getCallerClassLoader();                if (ccl != null) {                    sm.checkPermission(                        SecurityConstants.GET_CLASSLOADER_PERMISSION);                }            }        }        return forName0(name, initialize, loader);    }  

从上述的Class类的相关方法,可以看出forName()方法的实现还跟ClassLoader类有关。

static ClassLoader getCallerClassLoader() {        // NOTE use of more generic Reflection.getCallerClass()        Class caller = Reflection.getCallerClass(3);        // This can be null if the VM is requesting it        if (caller == null) {            return null;        }        // Circumvent security check since this is package-private        return caller.getClassLoader0();    }
这个是forName0(String,boolean,ClassLoader)中ClassLoader类调用的其自身的静态方法getCallerClassLoader()的实现代码。而实现代码中,又个Reflection类有关,调用了其静态方法getCallerClass(3)。那么,这个3是什么意思呢?无法查看源代码。

然后,百度了”getCallerClass(3)“,在一篇博文【2】中介绍了几种Classloader类,以及它们需要加载库的范围

  •     Bootstrap ClassLoader - GetClassLoader的返回值为Null,是JVM的C++源码, Ext ClassLoader 的Parent主要负责jdk_home/lib目录下的核心 api 或 -Xbootclasspath 选项指定的jar包装入工作
  •     System ClassLoader -  GetClassLoader返回值为SystemClassLoader. 主要负责java -classpath/-Djava.class.path所指的目录下的类与jar包装入工作
  •      Ext ClassLoader  - 是AppClassLoader 的Parent 返回Ext ClassLoader 主要负责jdk_home/lib/ext目录下的jar包或 -Djava.ext.dirs 指定目录下的jar包装入工作。
  •      App ClassLoader - 返回AppClassLoader。主要负责加载用户类
  •       Customer Class Loader  - 一般都继承App ClassLoader 用户自定义。

参考:

    http://blog.csdn.net/youlingqishi11/article/details/7395716

    http://blog.csdn.net/dianxer/article/details/6255823

转载于:https://my.oschina.net/u/815030/blog/139489

你可能感兴趣的文章
PHP高级编程之守护进程,实现优雅重启
查看>>
PHP字符编码转换类3
查看>>
rsync同步服务配置手记
查看>>
http缓存知识
查看>>
Go 时间交并集小工具
查看>>
iOS 多线程总结
查看>>
webpack是如何实现前端模块化的
查看>>
TCP的三次握手四次挥手
查看>>
关于redis的几件小事(六)redis的持久化
查看>>
webpack4+babel7+eslint+editorconfig+react-hot-loader 搭建react开发环境
查看>>
Maven 插件
查看>>
初探Angular6.x---进入用户编辑模块
查看>>
计算机基础知识复习
查看>>
【前端词典】实现 Canvas 下雪背景引发的性能思考
查看>>
大佬是怎么思考设计MySQL优化方案的?
查看>>
<三体> 给岁月以文明, 给时光以生命
查看>>
Android开发 - 掌握ConstraintLayout(九)分组(Group)
查看>>
springboot+logback日志异步数据库
查看>>
Typescript教程之函数
查看>>
Android 高效安全加载图片
查看>>