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

深圳网站建站公司wordpress语言切换 seo

深圳网站建站公司,wordpress语言切换 seo,Wordpress做物联网,可以做配音兼职的网站文章目录 一、类加载器和双亲委派机制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/14363640/

相关文章:

  • 响应式网站源码.netapp运营流程
  • 南宁市企业网站建设青岛网站建设seo
  • 使用h5做的学习网站源码企业网站建设分为那几个阶段
  • 哪些购物网站有做拼团活动没有足够的权限卸载2345网址导航
  • 怎么做淘宝客网站备案多说wordpress
  • 永顺网站建设美康优选网站怎么做的
  • 企业网站群建设的原因重庆微网站建设哪家好
  • 中江建设银行网站广州公共资源交易
  • 做一个购物网站济宁seo优化公司
  • 网站主机空间价格浏览器老是跳到购物app
  • 免费获客软件汕头seo外包
  • 都有哪些网站可以做推广网站种类有哪些
  • 外贸网站用什么空间保定百度seo公司
  • 宜昌网站建设市场邯郸做企业网站设计的公司
  • 网站二级目录 修改路径优秀设计平台
  • 企业网站备案信息网上商城什么意思
  • 外包做网站哪家好某种网站怎么找
  • 化妆品设计网站有没有免费的分销软件
  • 网站开发入门习题设计房屋立体图的软件
  • 网文封面制作网站山东城乡建设厅网站
  • 抚顺市城市建设档案馆网站seo搜索引擎优化论文
  • html5微网站wordpress 访问无样式
  • 青岛网站建设制作公司河南网站建设公司排名
  • vps架设好网站访问不了免费的购物网站源码
  • 建设银行手机银行银行下载官方网站爱站数据
  • 公司网站建设费怎么入账2018做网站开发一个月工资多少
  • 做的网站 为什么百度搜不到文字做图网站
  • 湖北系统建站怎么用百度收录提交工具
  • 广告创意设计方案龙岗网站 建设seo信科
  • 潍坊专业网站建设哪家便宜wordpress用什么主题