当前位置: 首页 > news >正文

网站备份脚本友情链接平台网站

网站备份脚本,友情链接平台网站,做百度网站每年的费用,中山哪家做网站好文章目录 一、类加载器和双亲委派机制1.1、类加载器1.2、双亲委派机制1.3、自定义类加载器1.4、打破双亲委派机制 二、类的加载 图片来源#xff1a;图灵学院   由上图可知#xff0c;创建对象#xff0c;执行其中的方法#xff0c;在java层面#xff0c;最重要的有获取… 文章目录 一、类加载器和双亲委派机制1.1、类加载器1.2、双亲委派机制1.3、自定义类加载器1.4、打破双亲委派机制 二、类的加载 图片来源图灵学院   由上图可知创建对象执行其中的方法在java层面最重要的有获取类加载器以及加载类两部分 一、类加载器和双亲委派机制 1.1、类加载器 在JVM中类加载器分为 启动类加载器最核心的类加载器用于加载JRE的lib目录下的核心类库。扩展类加载器负责加载位于JRE的lib目录下的ext扩展目录中的JAR类包。应用程序类加载器负责加载ClassPath路径下的类包。自定义类加载器用于加载用户自定义路径的类包。 sun.misc包下的Launcher类会在构造方法中对类加载器进行初始化   构造方法中的关键部分   sun.misc.Launcher.AppClassLoader#getAppClassLoader获取应用程序类加载器方法的最底层将参数中传入的扩展类加载器赋值给成员变量。   ExtClassLoader扩展类加载器继承自ClassLoader 1.2、双亲委派机制 双亲委派机制的核心是向上委派向下加载   即当加载某个类时会从最底层的类加载器开始逐个向上查找目标类如果加载过就直接返回。如果查找到最上层依旧没有则从最上层自身负责的类加载路径中查找并加载。 自己写的一个User类第一次运行应用程序类加载器没有找到向上查找扩展类、启动类加载器依然没有找到。就从最顶层的启动类加载器开始查看该类是否在自己的加载范围内。很显然自定义的类不在启动类加载器的范围内向下委派到扩展类加载器发现依旧不在自身的范围内就再次委派给应用程序类加载器这次发现在自己的加载范围内就会加载。java.lang包下的String类第一次运行应用程序类加载器没有找到向上查找扩展类、启动类加载器依然没有找到。就从最顶层的启动类加载器开始查看该类是否在自己的加载范围内。java.lang包下的String类属于核心类库启动类加载器发现它在自己应该加载的范围内就会进行加载。 双亲委派机制在源码中的体现在于java.lang.ClassLoader#loadClass(java.lang.String, boolean) protected Class? loadClass(String name, boolean resolve)throws ClassNotFoundException {synchronized (getClassLoadingLock(name)) {//首先查看当前的类加载器是否加载过目标底层是c/c实现的方法Class? c findLoadedClass(name);//当前的类加载器没有加载过if (c null) {long t0 System.nanoTime();try {//扩展类加载器进行查找//这里的parent属性是当前类加载器的父加载器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.long t1 System.nanoTime();//查看当前的类路径判断是否应该是自己加载。c findClass(name);// this is the defining class loader; record the statssun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);sun.misc.PerfCounter.getFindClasses().increment();}}if (resolve) {resolveClass(c);}return c;} }第一次加载某个自定义类时的流程   应用程序类加载器发现自身没有加载过去执行扩展类加载器的loadClass方法   扩展类加载器发现自身没有加载过去找启动类加载器底层由c/c执行  启动类加载器返回的c为空在扩展类加载器进入if判断尝试自己加载但是自定义的类不在自己的加载范围内将null值的c返回到应用程序类加载器:   应用程序类加载器得到扩展类加载器的返回为空就尝试自己加载并且返回 1.3、自定义类加载器 自定义类加载器需要继承ClassLoader并且重写其中的findClassloadClass方法 public class MyClassLoaderTest1 {static class MyClassLoader extends ClassLoader {private String classPath;public MyClassLoader(String classPath) {this.classPath classPath;}private byte[] loadByte(String name) throws Exception {name name.replaceAll(\\., /);FileInputStream fis new FileInputStream(classPath / name .class);int len fis.available();byte[] data new byte[len];fis.read(data);fis.close();return data;}protected Class? findClass(String name) throws ClassNotFoundException {try {byte[] data loadByte(name);//defineClass将一个字节数组转为Class对象这个字节数组是class文件读取后最终的字节数组。return defineClass(name, data, 0, data.length);} catch (Exception e) {e.printStackTrace();throw new ClassNotFoundException();}}}public static void main(String args[]) throws Exception {//初始化自定义类加载器会先初始化父类ClassLoader其中会把自定义类加载器的父加载器设置为应用程序类加载器AppClassLoaderMyClassLoader classLoader new MyClassLoader(D:/test);//D盘创建 test/com/tuling/jvm 几级目录将User类的复制类User1.class丢入该目录Class clazz classLoader.loadClass(com.itbaima.jvm.User);Object obj clazz.newInstance();Method method clazz.getDeclaredMethod(sout, null);method.invoke(obj, null);System.out.println(clazz.getClassLoader().getClass().getName());} }上面的自定义类加载器目的是为了加载D盘test文件夹下的com.itbaima.jvm的User.class文件假设目前的classpath下和D盘指定目录下都有该文件   那么根据双亲委派机制User类应该由应用程序类加载器而非自定义类加载器加载。原因很简单当User类被启动类加载器向下加载时在应用程序类加载器这一层发现属于自己的classpath范围内有这个类就会进行加载。   把classpath下的User类删除则由自定义类加载器进行加载 1.4、打破双亲委派机制 打破双亲委派机制的关键在于自定义实现loadClass方法。在1.3案例的基础上继续重写loadClass方法 Override protected Class? loadClass(String name, boolean resolve) throws ClassNotFoundException {synchronized (getClassLoadingLock(name)) {// First, check if the class has already been loadedClass? c findLoadedClass(name);if (c null) {long t0 System.nanoTime();// If still not found, then invoke findClass in order// to find the class.long t1 System.nanoTime();//让父类去加载Objectif (!name.startsWith(com.itbaima.jvm)) {c this.getParent().loadClass(name);}else {c findClass(name);}// this is the defining class loader; record the statssun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);sun.misc.PerfCounter.getFindClasses().increment();}if (resolve) {resolveClass(c);}return c;}在重写的loadClass方法中去除了向上委派的逻辑而是由自身进行加载为什么还要加上 if (!name.startsWith(com.itbaima.jvm)) {c this.getParent().loadClass(name);}的判断原因在于用当前的类加载器去加载User类没有问题但是User类继承了java.lang包下的Object类如果把判断条件去除   如果把Object.class文件复制一份到指定的目录呢   答案也是否定的因为在类加载的过程中JVM还有自己的安全监测机制是不会允许核心的类被自定义加载的。 二、类的加载 类的加载通过loadClass方法会经历验证、准备、解析、初始化四个阶段 验证阶段主要是校验class文件是否符合规范以及对正确性进行校验最经典的是cafe babe模数校验。准备阶段给类的静态属性分配内存并且赋初值(基本数据类型为默认值引用类型为null)。解析阶段将符号引用转变为直接引用符号引用简单可以理解为类中的方法名变量名等。而直接引用是符号引用真正指向的内存地址。初始化在这一步才是给类的静态属性赋值并且执行静态代码块。 静态代码块的执行先于构造方法
http://www.hkea.cn/news/14486181/

相关文章:

  • 如何查看网站 是哪家做的怎么做网站平台
  • 建设门户网站多少钱做网站的公司搞什么活动
  • 工商网上怎么申请注册公司网站如何做seo优化
  • cms网站开发php建设什么网站可以上传视频
  • 安徽省高等级公路工程建设指挥部网站wordpress 聊天室
  • 甘肃网站开发公司自己创做网站
  • 自己怎么做网站链接网站seo价格
  • 用word 做网站成都h5网站建设
  • ipad 设计网站wordpress时间有问题
  • 国家建设 免费论文期刊网站网站制作思路
  • 网站开发有哪些参考文献天津电力建设公司招标网站
  • 山东公司网站建设大街网企业招聘官网
  • 灵芝住房和城乡建设局局网站投资担保网站建设
  • 厦门正规网站建设多少邯郸哪里可以学建网站
  • 潍坊快速网站排名iis端口相同不同网站建设
  • 个人网站网页设计模板wordpress混乱
  • 家政公司网站怎么做天津建设网站的公司
  • 常州网站排名优化wordpress 房产模板
  • 网站改版 大量旧页面网站开发视频会议插件
  • 网站seo快速排名优化使用aspx做电影网站
  • 建设网站设计论文范文《网页制作与网站建设》
  • 建筑人才招聘网站平台看到一个电商网站帮做淘宝
  • 西宁知名网站设计公司免费推广方法
  • 网站建设如何赚钱wordpress免费教育机构主题
  • 安徽 网站信息内容建设成都进入搜索热度前五
  • 保定网站seo费用网盘资源共享群吧
  • 口碑好的赣州网站建设建筑模型网站
  • 网站建设性能指标宁夏百度公司
  • 平湖公司做网站企业网站托管和网站建设服务商
  • 360搜索的网站收录入口大淘客怎样做网站