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

汉中专业网站建设易语言如何做网站

汉中专业网站建设,易语言如何做网站,有网但无法打开网页怎么办,企业网页设计一案例驱动 二源码分析 三类加载器ClassLoader 四总结 五参考 一案例驱动 最近加载文件的时候遇到了一个问题#xff0c;很有意思#xff01; 具体看下面案例代码 public class TestClassLoader {public static void main(String[] args) {System.out.println(TestClassLoad…一案例驱动 二源码分析 三类加载器ClassLoader 四总结 五参考 一案例驱动 最近加载文件的时候遇到了一个问题很有意思 具体看下面案例代码 public class TestClassLoader {public static void main(String[] args) {System.out.println(TestClassLoader.class.getResource(ehcache.xml));System.out.println(TestClassLoader.class.getResource(/ehcache.xml));System.out.println();System.out.println(TestClassLoader.class.getClassLoader().getResource(ehcache.xml));System.out.println(TestClassLoader.class.getClassLoader().getResource(/ehcache.xml));} }file:/C:/myroad/utalitityUtils/target/classes/com/zsk/java/ file:/C:/myroad/utalitityUtils/target/classes/ file:/C:/myroad/utalitityUtils/target/classes/ null 那这两种方式有什么区别呢下面跟源码一探究竟。 二源码分析 首先我们跟一下这段源码 TestClassLoader.class.getResource(ehcache.xml) public java.net.URL getResource(String name) {name resolveName(name);ClassLoader cl getClassLoader0();// 获取加载该Class的ClassLoadersun.misc.Launcher$AppClassLoader18b4aac2if (clnull) { //如果加载该Class的ClassLoader为null则表示这是一个系统class// A system class.return ClassLoader.getSystemResource(name); //如果是系统class}return cl.getResource(name);//调用ClassLoader的getResource方法}下面是ClassLoader的getResource方法 public URL getResource(String name) {URL url;if (parent ! null) {//这里的parent为sun.misc.Launcher$ExtClassLoader7d4793a8url parent.getResource(name);//这里是一个递归调用再次进入之后parent为null} else {url getBootstrapResource(name);//到达系统启动类加载器}if (url null) {//系统启动类加载器没有加载到递归回退到第一次调用然后是扩展类加载器url findResource(name);}return url;//最后如果都没有加载到双亲委派加载失败则加载应用本身自己的加载器。}关于上面的 sun.misc.Launcher$AppClassLoader18b4aac2 sun.misc.Launcher$ExtClassLoader7d4793a8 后面原理会详细介绍源码没看明白也许看了下面的原理 就豁然开朗了。 下面我们跟一下getClassLoader源码看一下调用过程 System.out.println(TestClassLoader.class.getClassLoader().getResource());public URL getResource(String name) {URL url;if (parent ! null) {url parent.getResource(name);} else {url getBootstrapResource(name);}if (url null) {url findResource(name);}return url;}可以发现其实Class.getResource和ClassLoader.getResource 最终调用的是ClassLoader 类的getResource方法。只不过Class.getResource是先调用Class 的 getResource 方法在这个getResource 方法中再去调用ClassLoader 类的getResource方法 那么Class类中的getResource方法做了什么呢主要的一句是 name resolveName(name); 我们看一下这个代码实现 private String resolveName(String name) {if (name null) {return name;}if (!name.startsWith(/)) { //对于不以/开头的文件Class? c this; //获取当前加载类的完整的类路径我这里是com.zsk.java.TestClassLoaderwhile (c.isArray()) {c c.getComponentType();}String baseName c.getName();int index baseName.lastIndexOf(.);//找到文件的包名称if (index ! -1) {name baseName.substring(0, index).replace(., /)/name;//将包名称中的.替换为/ 并在最后加上/ 文件名}} else {name name.substring(1); //对于/开头的文件名会只保留文件名称部分。}return name;}TestClassLoader.class.getResource() Class类中的getResource方法返回的是com/zsk/java/ ClassLoader类中的getResource方法返回的是 file:/C:/myroad/utalitityUtils/target/classes/com/zsk/java/ TestClassLoader.class.getResource(/) Class类中的getResource方法返回的是 ClassLoader类中的getResource方法返回的是 file:/C:/myroad/utalitityUtils/target/classes/ 这也就解释了为什么我们放在resource文件夹中的文件第一个返回null 而第二个可以正常访问了。 JDK设置这样的规则是很好理解的path不以’/‘开头时我们就能获取与当前类所在的路径相同的资源文件而以’/开头时可以获取ClassPath根下任意路径的资源。 TestClassLoader.class.getClassLoader().getResource() ClassLoader类中的getResource方法返回的是 file:/C:/myroad/utalitityUtils/target/classes/ TestClassLoader.class.getClassLoader().getResource(/) ClassLoader类中的getResource方法返回的是 null 对于ClassLoader.getResource 直接调用的就是ClassLoader 类的getResource方法那么对于getResource()path不以’/‘开头时首先通过双亲委派机制使用的逐级向上委托的形式加载的最后发现双亲没有加载到文件最后通过当前类加载classpath根下资源文件。对于getResource(/)’/表示Boot ClassLoader中的加载范围因为这个类加载器是C实现的所以加载范围为null。 三类加载器ClassLoader 1、类加载器ClassLoader 我们都知道 Java 文件被运行第一步需要通过 javac 编译器编译为 class 文件第二步JVM 运行 class 文件实现跨平台。而 JVM 虚拟机第一步肯定是 加载 class 文件所以类加载器实现的就是来自《深入理解Java虚拟机》 通过一个类的全限定名来获取描述此类的二进制字节流 类加载器有几个重要的特性 每个类加载器都有自己的预定义的搜索范围用来加载 class 文件 每个类和加载它的类加载器共同确定了这个类的唯一性也就是说如果一个 class 文件被不同的类加载器加载到了 JVM 中那么这两个类就是不同的类虽然他们都来自同一份 class 文件 双亲委派模型。 2.1 双亲委派模型 所有的类加载器都是有层级结构的每个类加载器都有一个父类类加载器通过组合实现而不是继承除了启动类加载器Bootstrap ClassLoader 当一个类加载器接收到一个类加载请求时首先将这个请求委派给它的父加载器去加载所以每个类加载请求最终都会传递到顶层的启动类加载器如果父加载器无法加载时子类加载器才会去尝试自己去加载 通过双亲委派模型就实现了类加载器的三个特性 委派delegation子类加载器委派给父类加载器加载 可见性visibility子类加载器可访问父类加载器加载的类父类不能访问子类加载器加载的类 唯一性uniqueness可保证每个类只被加载一次比如 Object 类是被 Bootstrap ClassLoader 加载的因为有了双亲委派模型所有的 Object 类加载请求都委派到了 Bootstrap ClassLoader所以保证了只被加载一次。 以上就是类加载器的一些特性那么在 Java 中类加载器是如何实现的呢 2.2 Java 中的类加载器 从 JVM 虚拟机的角度来看只存在两种不同的类加载器 启动类加载器Bootstrap ClassLoader是虚拟机自身的一部分 所有其他的类加载器独立于虚拟机外部都继承自抽象类 java.lang.ClassLoader。 而绝大多数 Java 应用都会用到如下 3 中系统提供的类加载器 启动类加载器Bootstrap/Primordial/NULL ClassLoader顶层的类加载器没有父类加载器。负责加载 /lib 目录下的或则被 -Xbootclasspath 参数所指定路径中的并被 JVM 识别的仅按文件名识别如 rt.jar名字不符合的类库即使放在 lib 目录也不会被加载类库加载到虚拟机内存中。所有被 Bootstrap classloader 加载的类它的 Class.getClassLoader 方法返回的都是 null所以也称作 NULL ClassLoader。 扩展类加载器Extension CLassLoader由 sun.misc.LauncherExtClassLoader实现负责加载JAVAHOME/lib/ext目录下或被java.ext.dirs系统变量所指定的目录下的所有类库应用程序类加载器Application/SystemClassLoader由sun.misc.LauncherExtClassLoader 实现负责加载 JAVA_HOME/lib/ext 目录下或被 java.ext.dirs 系统变量所指定的目录下的所有类库 应用程序类加载器Application/System ClassLoader由 sun.misc.LauncherExtClassLoader实现负责加载JAVAH​OME/lib/ext目录下或被java.ext.dirs系统变量所指定的目录下的所有类库应用程序类加载器Application/SystemClassLoader由sun.misc.LauncherAppClassLoader 实现。它是 ClassLoader.getSystemClassLoader() 方法的默认返回值所以也称为系统类加载器System ClassLoader。它负责加载 classpath 下所指定的类库如果应用程序没有自定义过自己的类加载器一般情况下这个就是程序中默认的类加载器。 如下就是 Java 程序中的类加载器层级结构图 以上我们介绍了 Java 系统的类加载器 四总结 最后进行一个总结Class.getResource和ClassLoader.getResource的区别就是在加载资源文件的时候加载方式的不同 class.getResource(/) class.getClassLoader().getResource() 其实Class.getResource和ClassLoader.getResource本质上是一样的都是使用ClassLoader.getResource加载资源的。 Class.getResource真正调用ClassLoader.getResource方法之前会先获取文件的路径path不以’/‘开头时默认是从此类所在的包下取资源path以’/开头时则是从项目的ClassPath根下获取资源。 ClassLoader.getResource方法会通过双亲委派机制先委派双亲去加载类如果双亲没有加载到则再由自己加载。
http://wiki.neutronadmin.com/news/239806/

相关文章:

  • 企业网站 asp php能让手机流畅到爆的软件
  • 网站编程源码免费app开发软件多少钱
  • 淘宝网官方网站网络营销策略存在的问题
  • 网站建设公司比较广州番禺区职业技术学校中职
  • 新闻类网站排版网站建设wordpress 搜索 自定义
  • 洛阳网站设计网站建设流程域名注册
  • 音乐网站建设水务行业国企门户网站建设
  • 专业做网站和小程序魏县网站建设推广
  • 云南省住房和城乡建设厅勘察设计处网站个人网页制作代码模板
  • 河北网站推广公司手机无法登录wordpress
  • 免费搭建网站的平台免费ppt插图高清图片
  • 网站备案后怎么做实名认证网站广告弹出来代码
  • 广州那家做网站最好昆山做网站公司有哪些
  • 简单php企业网站源码seo网站推广怎样
  • 有网站怎么建设手机站响应式网站如何做
  • 手机购物网站 设计黑龙江新闻法治频道节目回放
  • 企业网站带新闻发布功能的建站澄海手工外发加工网
  • 中国建设协会网站厦门营销型网站建设
  • 家庭宽带做私人网站公司推广策划方案
  • 电子商务综合实训报告网站建设游戏服务器搭建
  • 电子商务网站建设课外实训软件技术要学什么
  • 商业网站网址实现wordpress注册模板
  • 国产做爰网站wordpress照片库
  • html成品网站vr技术对网站建设有哪些影响
  • 外贸网站建设哪里有专业产品画册设计公司
  • 好的网站建设价格个人网站 icp
  • 东南亚购物网站排名怎么做淘宝客手机网站
  • 网站后台扫描插件盘锦网站变建设
  • 安徽省水利厅j建设网站wordpress 下载源
  • 工贸一体化企业建设电子商务网站的误区机械英文网站