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

网站开发需求文档prd模板桂林北站地址

网站开发需求文档prd模板,桂林北站地址,建模师培训机构有哪些,外贸网站外链一#xff1a;ClassLoader类加载器#xff0c;主要的作用是将class文件加载到jvm虚拟机中。jvm启动的时候#xff0c;并不是一次性加载所有的类#xff0c;而是根据需要动态去加载类#xff0c;主要分为隐式加载和显示加载。隐式加载#xff1a;程序代码中不通过调用Clas…一ClassLoader类加载器主要的作用是将class文件加载到jvm虚拟机中。jvm启动的时候并不是一次性加载所有的类而是根据需要动态去加载类主要分为隐式加载和显示加载。  隐式加载程序代码中不通过调用ClassLoader来加载需要的类而是通过JVM类自动加载需要的类到内存中。例如当我们在类中继承或者引用某个类的时候JVM在解析当前这个类的时发现引用的类不在内存中那么就会自动将这些类加载到内存中。  显示加载代码中通过Class.forNamethis.getClass.getClassLoader.LoadClass自定义类加载器中的findClass方法等。二jvm自带的加载器1BootStrap ClassLoader主要加载%JRE_HOME%lib下的rt.jar、resources.jar、charsets.jar和class等。可以通System.getProperty(sun.boot.class.path) 查看加载的路径如下package test; public class TestGC { public static void main(String []args){ System.out.println(System.getProperty(sun.boot.class.path)); } } 显示结果如下D:Program FilesJavajdk1.7.0_45jrelibresources.jar;D:Program FilesJavajdk1.7.0_45jrelibrt.jar;D:Program FilesJavajdk1.7.0_45jrelibsunrsasign.jar;D:Program FilesJavajdk1.7.0_45jrelibjsse.jar;D:Program FilesJavajdk1.7.0_45jrelibjce.jar;D:Program FilesJavajdk1.7.0_45jrelibcharsets.jar;D:Program FilesJavajdk1.7.0_45jrelibjfr.jar;D:Program FilesJavajdk1.7.0_45jreclasses2Extention ClassLoader主要加载目录%JRE_HOME%libext目录下的jar包和class文件。也可以通过System.out.println(System.getProperty(java.ext.dirs))查看加载类文件的路径。3AppClassLoader主要加载当前应用下的classpath路径下的类。之前我们在环境变量中配置的classpath就是指定AppClassLoader的类加载路径。三类加载器的继承关系  先看一下这三个类加载器之间的继承关系如下图 ExtClassLoaderAppClassLoder继承URLClassLoader而URLClassLoader继承ClassLoaderBoopStrap ClassLoder不在上图中因为它是由C/C编写的它本身是虚拟机的一部分并不是一个java类。jvm加载的顺序BoopStrap ClassLoder-〉ExtClassLoader-AppClassLoder下面看一段源码public class Launcher { private static Launcher launcher new Launcher(); private static String bootClassPath System.getProperty(sun.boot.class.path); public static Launcher getLauncher() { return launcher; } private ClassLoader loader; public Launcher() { // Create the extension class loader ClassLoader extcl; try { extcl ExtClassLoader.getExtClassLoader(); } catch (IOException e) { throw new InternalError( Could not create extension class loader, e); } // Now create the class loader to use to launch the application try { loader AppClassLoader.getAppClassLoader(extcl); } catch (IOException e) { throw new InternalError( Could not create application class loader, e); } Thread.currentThread().setContextClassLoader(loader); } /* * Returns the class loader used to launch the main application. */ public ClassLoader getClassLoader() { return loader; } /* * The class loader used for loading installed extensions. */ static class ExtClassLoader extends URLClassLoader {} /** * The class loader used for loading from java.class.path. * runs in a restricted security context. */ static class AppClassLoader extends URLClassLoader {} 从源码中我们看到1Launcher初始化的时候创建了ExtClassLoader以及AppClassLoader并将ExtClassLoader实例传入到AppClassLoader中。   2虽然上一段源码中没见到创建BoopStrap ClassLoader但是程序一开始就执行了System.getProperty(sun.boot.class.path)。四类加载器之间的父子关系    AppClassLoader的父加载器为ExtClassLoaderExtClassLoader的父加载器为nullBoopStrap ClassLoader为顶级加载器。 下面一个小例子就可以证明如下新建一个Test类可以通过getParent方法获取上一层父机载器执行如下代码package test; public class TestGC { public static void main(String []args){ System.out.println(Test.class.getClassLoader().toString()); System.out.println(Test.class.getClassLoader().getParent().toString()); System.out.println(Test.class.getClassLoader().getParent().getParent().toString()); } } 输出结果如下五类加载机制-双亲委托机制  例如当jvm要加载Test.class的时候  1首先会到自定义加载器中查找看是否已经加载过如果已经加载过则返回字节码。  2如果自定义加载器没有加载过则询问上一层加载器(即AppClassLoader)是否已经加载过Test.class。  3如果没有加载过则询问上一层加载器ExtClassLoader是否已经加载过。  4如果没有加载过则继续询问上一层加载BoopStrap ClassLoader是否已经加载过。  5如果BoopStrap ClassLoader依然没有加载过则到自己指定类加载路径下sun.boot.class.path查看是否有Test.class字节码有则返回没有通知下一层加载器ExtClassLoader到自己指定的类加载路径下java.ext.dirs查看。  6依次类推最后到自定义类加载器指定的路径还没有找到Test.class字节码则抛出异常ClassNotFoundException。如下图六类加载过程的几个方法  1loadClass 2findLoadedClass 3findClass protected Class? loadClass(String name, boolean resolve) throws ClassNotFoundException { synchronized (getClassLoadingLock(name)) { // 首先检查是否已经加载过 Class? c findLoadedClass(name); if (c null) { long t0 System.nanoTime(); try { if (parent ! null) { //父加载器不为空,调用父加载器的loadClass c parent.loadClass(name, false); } else { //父加载器为空则,调用Bootstrap Classloader 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(); //父加载器没有找到则调用findclass c findClass(name); // this is the defining class loader; record the stats sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0); sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1); sun.misc.PerfCounter.getFindClasses().increment(); } } if (resolve) { //调用resolveClass() resolveClass(c); } return c; } }七自定义类加载器步骤  1继承ClassLoader 2重写findClass方法 3调用defineClass方法  下面写一个自定义类加载器指定类加载路径在D盘下的lib文件夹下。  1新建一个Test.class类代码如下package com.test; public class Test { public void say(){ System.out.println(Hello MyClassLoader); } } 2cmd控制台执行javac Test.java将生成的Test.class文件放到D盘lib文件夹-com文件夹-test文件夹下。  3自定义类加载器代码如下package test; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; public class MyClassLoader extends ClassLoader{ private String classpath; public MyClassLoader(String classpath) { this.classpath classpath; } Override protected Class? findClass(String name) throws ClassNotFoundException { try { byte [] classDategetDate(name); if(classDatenull){} else{ //defineClass方法将字节码转化为类 return defineClass(name,classDate,0,classDate.length); } } catch (IOException e) { e.printStackTrace(); } return super.findClass(name); } //返回类的字节码 private byte[] getDate(String className) throws IOException{ InputStream in null; ByteArrayOutputStream out null; String pathclasspath File.separatorChar className.replace(.,File.separatorChar).class; try { innew FileInputStream(path); outnew ByteArrayOutputStream(); byte[] buffernew byte[2048]; int len0; while((lenin.read(buffer))!-1){ out.write(buffer,0,len); } return out.toByteArray(); } catch (FileNotFoundException e) { e.printStackTrace(); } finally{ in.close(); out.close(); } return null; } }  测试代码如下package test; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class TestMyClassLoader { public static void main(String []args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException{ //自定义类加载器的加载路径 MyClassLoader myClassLoadernew MyClassLoader(D:lib); //包名类名 Class cmyClassLoader.loadClass(com.test.Test); if(c!null){ Object objc.newInstance(); Method methodc.getMethod(say, null); method.invoke(obj, null); System.out.println(c.getClassLoader().toString()); } } } 输出结果如下自定义类加载器的作用jvm自带的三个加载器只能加载指定路径下的类字节码。如果某个情况下我们需要加载应用程序之外的类文件呢比如本地D盘下的或者去加载网络上的某个类文件这种情况就可以使用自定义加载器了。
http://www.zqtcl.cn/news/901239/

相关文章:

  • 网站从哪些方面来做泉州网页搜索排名提升
  • 网站建设可以给公司带来想做网站开发兼职
  • 天津市免费建站精美大气的餐饮类企业网站
  • 购物网站那个信用好又便宜手机模板的网站
  • 建筑企业资质查询网站怎么查网络服务商
  • 汉川市城乡建设局网站企业销售网站建设
  • 梅州建设网站域名购买流程
  • 单页网站与传统网站的区别wordpress对接微信
  • 做公司网站深圳旅游
  • 最好企业网站网站建设 的销售图片
  • 怎么创建网站 免费滴做网站算运营吗
  • 廊坊网站建设-商昊网络正规网站优化推广
  • 网站建设拍金手指排名贰贰安装wordpress数据库错误
  • 食品网站建设需求分析购物app大全
  • 电商美工广州seo技术外包公司
  • 重庆旅游seo整站优化深圳宝安区是富人区吗
  • 网站开发验收模板网站欧美风格
  • 自己做发卡网站什么是网络设计制作
  • 如何搭建一个公司网站互联网推广怎么找客户
  • 江苏同隆建设集团有限公司网站asp.net新建网站
  • 爱站网挖掘工具小程序网站开发怎么样
  • 网站文章批量上传工具自己制作免费网站
  • 凡科快速建站建设网站遇到问题的解决方案
  • 深圳市公司网站建设公司十大互联网营销公司
  • 免费发布推广信息的网站百度招聘2022年最新招聘
  • 建站公司怎么获客任县附近网站建设价格
  • 泰兴市淘宝网站建设指数 网站权重
  • 烟台市做网站找哪家好才艺多网站建设
  • nginx wordpress 重写seo技术大师
  • 公司网站建设需要什么科目上海服务政策调整