写了一个string 类,和api中包名,类名都是一样的,然后去加载:

1 package java.lang;
2 public class String{
3     public static void main(String[] args ){
4     }
5 }

大家发现什么不同了吗?对了,我们写了一个与JDK中String一模一样的类,连包java.lang都一样,唯一不同的是我们自定义的String类有一个main函数。我们来运行一下:

java.lang.NoSuchMethodError: main
 Exception in thread "main"

这是为什么? 我们的String类不是明明有main方法吗?

其实联系到jvm类加载的双亲委托模型,我们就能解释这个问题了。

运行这段代码,AppClassLoader会尝试加载java.lang.String这个类,但是根据双亲委托模型AppClassLoader会将加载java.lang.String的请求委托给ExtClassLoader,而 ExtClassLoader又会委托给最后的启动类加载器BootstrapLoader。

启动类加载器BootstrapLoader只能加载JAVA_HOME\jre\lib中的class类(即J2SE API),问题是标准API中确实有一个java.lang.String(注意,这个类和我们自定义的类是完全两个类)。BootstrapLoader以为找到了这个类,毫不犹豫的加载了j2se api中的java.lang.String。

最后出现上面的加载错误(注意不是异常,是错误,JVM退出),因为API中的String类是没有main方法的。

结论:我们当然可以自定义一个和API完全一样的类,但是由于双亲委托模型,使得我们不可能加载上我们自定义的这样一个类。所以J2SE规范中希望我们自定义的包有自己唯一的特色(网络域名)。还有一点,这种加载器原理使得JVM更加安全的运行程序,因为黑客很难随意的替代掉API中的代码了。

Java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个类负责加载特定位置的类:BootStrap,ExtClassLoader,AppClassLoader
类加载器也是Java类,因为其他是java类的类加载器本身也要被类加载器加载,显然必须有第一个类加载器不是不是java类,这正是BootStrap。
jvm三级类加载器 类加载采用委托模型,就是顶层类加载器先是启动,然后将加载类动作传给(委托)上一层父类加载器,依次到bootstrap classloader,当根加载器没有加载到,那么又会返回给其下一级子类加载器,依次又传给当前的子类加载器。如果还没有找到,那么就是class not found.说白了无论加载什么类,都是从根加载起来的,根类库没有依次往后找。
为什么要有这种委托机制?
这样的好处,不让你修改Java原生的类库和本地类库,如果你想自己定义,可以应该是修改了包名或者类名,这样也能防止网络传过来的类取代本地类库或者api,防止入侵。

java 类加载器加载顺序 经典例子相关推荐

  1. Android进阶:十三、自定义类加载器加载加密类文件

    之前面试的时候有许多面试官问类加载器相关的问题,所以这是一个很重要的知识点.而且对于高级Android研发来讲,懂得更多类加载相关的东西,对开发也会有很多的帮助,比如热更新,类加密等. 其实笔者对类加 ...

  2. 自定义类加载器加载冲突类(一)-ClassLoader

    使用场景:项目中遇到使用不同版本的类时候因为同路径同名类的冲突可以使用自定义类加载器进行加载规避这一问题 相关代码如下: 代码 1. 类加载器: import java.io.File; import ...

  3. java中类的加载顺序

    java中类加载顺序: 1)静态代码块只执行一次:静态代码块首先被初始化 2)构造代码块在每次创建对象都会执行:构造函数都是最后执行的. 3)按照父子类继承关系进行初始化,先执行父类的初始化: 4)程 ...

  4. 【ClassLoader】实现自定义类加载器加载指定路径下的Class文件和Jar包

    文章目录 前言 自定义类加载器加载.class文件 自定义类加载器加载jar包文件 前言 在web开发中,一般我们是不需要去自己实现类加载器的,常见的web容器已经帮我们实现了指定路径下的加载,比如我 ...

  5. java 类的加载顺序

    类的加载顺序 public class ClassA {public static ClassA classa = new ClassA();static{System.out.println(&qu ...

  6. java 初始化的加载顺序问题

    总结一下java里面关于初始化的加载顺序问题: 考虑有一个基类和一个子类的情况 那么,当实例化一个子类的对象或者访问子类的静态域或静态方法时,会进行类的加载. 1)完成基类的static域和stati ...

  7. java 和 spring加载顺序问题

    问题1:加载顺序问题: conf.properites配置如下: fetchJobsSchedule=0 25 0 * * ? updateJobsSchedule=0 12 17 * * ? jav ...

  8. JAVA Web.xml 加载顺序

    web.xml加载过程(步骤): 1.启动WEB项目的时候,容器(如:Tomcat)会去读它的配置文件web.xml.读两个节点: <listener></listener> ...

  9. java类的加载顺序题目_Java 类的加载顺序(题)

    引例 public class A extends B { public int a = 100; public A() { super(); System.out.println(a); a = 2 ...

最新文章

  1. linux 编译错误 configure: error: C++ compiler cannot create executables
  2. 清空sqlserver当前日志信息!
  3. 使用Statement接口实现增,删,改操作
  4. 利用IPFS构建自己的去中心化分布式Wiki系统
  5. CIKM 2021 | BH:面向Web级应用的基于二进制码的Hash Embedding
  6. cc java开发环境搭建_Windows系统下java开发环境搭建
  7. arcmap添加WMTS服务
  8. 目前最先进的目标检测能用于自动驾驶吗?这群德国人认真地做了个测评!
  9. Spring框架----Spring的基于XML的AOP的实现
  10. 信息必填的php,php - {“成功”:0,“消息”:“必填字段丢失”}在本地主机上测试文件 - 堆栈内存溢出...
  11. Python 进阶——标准散列机制
  12. 类的反射实例(servlet的抽取)
  13. 深入了解C++用什么软件编程
  14. ACM32 MCU元器件AD封装库
  15. JAVA通过Jemter工具并发测试
  16. 输入输出工具技术(ITTO)要背吗?——软考高项笔记8
  17. UE4_Shader Compile 停在某一帧或者新建材质出现卡死
  18. 完全免费最好的在线pdf转换成word免费版
  19. Image Signal Processing(ISP)-第三章-BCL, WB, Gamma的原理和软件实现
  20. python 读取数据出现UnicodeDecodeError:: ‘utf-8‘ codec can‘t decode byte 0xc8 in position 0: invalid contin

热门文章

  1. ModuleNotFoundError: No module named 'oscar.app'
  2. 关于“xxx”object is not callable的异常(转)
  3. ubuntu下面使用clion
  4. s7 200 java_java android 读写西门子PLC数据,包含S7协议和Fetch/Write协议,s7支持200smart,300PLC,1200PLC,1500PLC...
  5. springboot连接SQL数据库配置application
  6. java 开源 网络流量统计_jpcap java流量监控
  7. 流放之路材质过滤怎么设置_房子装修,前置过滤器怎么选?看这6个要点
  8. 数据库程序接口——JDBC——功能第五篇——批量处理
  9. Linux时间 时区 同步
  10. CentOS7 iso封装语句