如何评价伊利集团网站建设,谷歌字体wordpress主题,深圳有哪些大公司,外贸网站优化怎么做当你超过别人一点点#xff0c;别人会嫉妒你#xff1b;当你超过别人一大截#xff0c;别人就会羡慕你
据说给我点关注的都成了大佬#xff0c;点关注的我都会私发一份好东西
你得先知道
在介绍双亲委派机制的时候#xff0c;不得不提ClassLoader#xff08;类…当你超过别人一点点别人会嫉妒你当你超过别人一大截别人就会羡慕你
据说给我点关注的都成了大佬点关注的我都会私发一份好东西
你得先知道
在介绍双亲委派机制的时候不得不提ClassLoader类加载器。说ClassLoader之前我们得先了解下Java的基本知识。 Java是运行在Java的虚拟机(JVM)中的但是它是如何运行在JVM中了呢我们在IDE中编写的Java源代码被编译器编译成.class的字节码文件。然后由我们得ClassLoader负责将这些class文件给加载到JVM中去执行。 JVM中提供了三层的ClassLoader Bootstrap classLoader:主要负责加载核心的类库(java.lang.*等)构造ExtClassLoader和APPClassLoader。 ExtClassLoader主要负责加载jre/lib/ext目录下的一些扩展的jar。 AppClassLoader主要负责加载应用程序的主函数类 那如果有一个我们写的Hello.java编译成的Hello.class文件它是如何被加载到JVM中的呢别着急请继续往下看。
双亲委派机制
我打开了我的AndroidStudio搜索了下“ClassLoader”,然后打开“java.lang”包下的ClassLoader类。然后将代码翻到loadClass方法 public Class? loadClass(String name) throws ClassNotFoundException { return loadClass(name, false); } // -----??----- protected Class? loadClass(String name, boolean resolve) throws ClassNotFoundException { // 首先检查是否已经被类加载器加载过 Class? c findLoadedClass(name); if (c null) { try { // 存在父加载器递归的交由父加载器 if (parent ! null) { c parent.loadClass(name, false); } else { // 直到最上面的Bootstrap类加载器 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); } } return c; } 其实这段代码已经很好的解释了双亲委派机制为了大家更容易理解我做了一张图来描述一下上面这段代码的流程 从上图中我们就更容易理解了当一个Hello.class这样的文件要被加载时。不考虑我们自定义类加载器首先会在AppClassLoader中检查是否加载过如果有那就无需再加载了。如果没有那么会拿到父加载器然后调用父加载器的loadClass方法。父类中同理也会先检查自己是否已经加载过如果没有再往上。注意这个类似递归的过程直到到达Bootstrap classLoader之前都是在检查是否加载过并不会选择自己去加载。直到BootstrapClassLoader已经没有父加载器了这时候开始考虑自己是否能加载了如果自己无法加载会下沉到子加载器去加载一直到最底层如果没有任何加载器能加载就会抛出ClassNotFoundException。那么有人就有下面这种疑问了
为什么要设计这种机制
这种设计有个好处是如果有人想替换系统级别的类String.java。篡改它的实现在这种机制下这些系统的类已经被Bootstrap classLoader加载过了为什么因为当一个类需要加载的时候最先去尝试加载的就是BootstrapClassLoader所以其他类加载器并没有机会再去加载从一定程度上防止了危险代码的植入。
总结了一张脑图如下