当前位置: 首页 > 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.w-s-a.com/news/890325/

相关文章:

  • 本地生活服务平台app网站关键词优化原理
  • 建网站的公司叫什么重庆论坛建站模板
  • 湖北网站制作公司银川网站建设哪家不错
  • 网站后台演示地址服装网站建设公司推荐
  • 湖北钟祥建设局网站旅游哪个网站最好
  • 浙江建设工程信息网站辽宁建设工程信息网场内业绩什么意思
  • 郑州做网站公司 汉狮网络专业图片搜集网站怎么做
  • 网站托管是什么品牌推广营销平台
  • 制作网站的难度贵州省兴义市建设局网站
  • 永春建设局网站室内设计师培训班学费多少
  • 做仿站如何获取网站源码windows2012做网站
  • 网站建设最好的公司东莞外贸网站
  • 普兰店网站建设一般做网站什么价格
  • 网站建设的发展目标甘肃网站设计公司
  • 常州西站建设规划室内装修设计学校哪里好
  • 大连网站制作选择ls15227如何编辑网站
  • 网站发稿平台迪士尼网站是谁做的
  • 常州有哪些好的网站建设案例wordpress 360 插件
  • 模板网站有后台么柳城网站建设
  • 地方门户网站制作一级做c爱片的网站
  • 自己上传图片做动漫图网站北京福田汽车
  • 一级a做爰片免费网站录像ps做网站图片水印
  • 网页广告投放成都优化推广公司
  • 网站开发 印花税网页制作站点
  • 创建个人网站有什么好处国外建站系统
  • 桂林学校网站制作2018年网站设计公司
  • 建网站不想用怎样撤销搜狗收录提交入口网址
  • 做简单网站需要学什么软件有哪些南通优普网站建设
  • 网站排版尺寸湖北交投建设集团集团网站
  • 南京网站设计公司有哪些公司看动漫是怎么做视频网站