`
lxiaodao
  • 浏览: 121327 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

重温ClassLoader加载使用

阅读更多
本文的目的重温ClassLoader、ContextClassLoader加载使用,展示可能忽略的东西,虽然内容不是多么复杂,但是出现一些问题而不明白原因时,会让人"抓狂"。
public class ConfigurationPathTest {
       public static void main(String[] arr){
           ClassLoader cload = Thread.currentThread().getContextClassLoader();    
           System.out.println("------------------getContextClassLoader加载指定的common/conf/configuration.xml配置文件---------------------"+cload.getResource("common/conf/configuration.xml"));
           //StandaloneContainer exo.kernel.container-2.1.2.jar
           System.out.println("---------------------getClassLoader加载指定的common/conf/configuration.xml配置文件--------------------------------:"+ConfigurationPathTest.class.getClassLoader().getResource("common/conf/configuration.xml"));
           //jar:file:/D:/workspace/ExoDemo/lib/exo.kernel.container-2.1.2.jar!/conf/configuration.xml
           //-----------------------具体类路径和classpath路径--------------------------//           
           System.out.println("-------------getClassLoader加载classpath----------------"+ConfigurationPathTest.class.getResource(""));         
           System.out.println("-------------getContextClassLoader加载classpath----------------"+cload.getResource(""));           
           System.out.println("-------------System classpath----------------"+ConfigurationPathTest.class.getClassLoader().getResource(""));
           
           //-----------------------优先从classpath加载,然后从lib的jar包加载--------------------------//
           System.out.println("-------------第二次 getClassLoader加载classpath----------------"+ConfigurationPathTest.class.getResource("/login.conf"));         
           System.out.println("-------------第二次getContextClassLoader加载classpath ----------------"+cload.getResource("login.conf"));           
           System.out.println("-------------第二次System classpath ----------------"+ConfigurationPathTest.class.getClassLoader().getResource("login.conf"));
           
           System.out.println("-------------第3次getClassLoader加载classpath----------------"+ConfigurationPathTest.class.getResource("/login_prev.conf"));         
           System.out.println("-------------第3次getContextClassLoader加载classpath----------------"+cload.getResource("login_prev.conf"));           
           System.out.println("-------------第3次System classpath----------------"+ConfigurationPathTest.class.getClassLoader().getResource("login_prev.conf"));
       
       }
    
}

执行,打印内容关键罗列如下:
file:/D:/workspace/UCMTest/bin/com/huaweisymantec/ucm/jcr/api/
file:/D:/workspace/UCMTest/bin/
file:/D:/workspace/UCMTest/bin/

file:/D:/workspace/UCMTest/bin/login.conf
file:/D:/workspace/UCMTest/bin/login.conf
file:/D:/workspace/UCMTest/bin/login.conf

jar:file:/D:/workspace/UCMTest/lib/com.huaweisymantec.ucm-1.0.jar!/login_prev.conf
jar:file:/D:/workspace/UCMTest/lib/com.huaweisymantec.ucm-1.0.jar!/login_prev.conf
jar:file:/D:/workspace/UCMTest/lib/com.huaweisymantec.ucm-1.0.jar!/login_prev.conf

从加载路径可以看出
(1)ConfigurationPathTest.class.getResource("")是指明了具体包路径
而ClassLoader.getResource("")指明了classpath路径
(2)同样是从classpath加载,写法有一点点区别(要小心)
ConfigurationPathTest.class.getResource("/login.conf")       
ClassLoader.getResource("login.conf")
(3)getResource()方法会首先从classpath路径去找要加载的文件;如果不存在,再去jar包加载;如果都没有,返回null
(4)getResources()方法同时加载classpath和jar内的内容,如:ClassLoader.getResources("common/conf/configuration.xml");
(如果class和jar中都有此配置文件,使用不当会造成困惑:两个都加载了,到底哪个是在使用的;如果出错,哪个导致了出错)
0
0
分享到:
评论

相关推荐

    ClassLoader类加载机制和原理详解

    在Java编程语言中,ClassLoader是核心组件之一,它负责加载类到JVM(Java虚拟机)中执行。本文将深入探讨ClassLoader的工作原理和类加载机制,帮助开发者理解这个至关重要的概念。 1. 类加载机制概述 Java的类加载...

    使用classloader动态加载Class

    总之,理解并掌握如何使用ClassLoader动态加载Class是Java开发中的重要技能,它能帮助我们构建更灵活、可扩展的系统。在实现过程中,要兼顾性能、安全和可维护性,合理设计类加载策略,确保代码的高效运行。

    【图解版】深入分析ClassLoader类加载工作机制

    【图解版】深入分析ClassLoader类加载工作机制,从原理到JVM的装载过程,详情分析了ClassLoader加载类以及自定义类加载器的过程,不可用于商业用途,如有版权问题,请联系删除!

    ClassLoader加载机制

    该电子书详细介绍了java虚拟机类加载机制,对于深入理解jvm工作原理有很好的帮助作用,对于初学java,有一定工作经验的小伙伴来说是一本提高自身java素养,夯实自己java基本技能的“葵花宝典”。

    自定义classloader的使用

    在Java中,Classloader是加载类的关键组件,它负责查找、加载和初始化字节码文件。自定义Classloader允许开发者根据特定需求定制类的加载逻辑,例如加密类文件、隔离不同版本的库或者动态加载代码。本文将深入探讨...

    ClassLoader类加载器

    以下是对ClassLoader API的使用和自定义的详细说明。 首先,我们来看ClassLoader的基本概念。在Java中,每个类都是由一个ClassLoader实例加载的。系统中存在三种基本的ClassLoader: 1. Bootstrap ClassLoader:这...

    java中classLoader的使用

    Java中的类加载器(ClassLoader)是Java虚拟机(JVM)的一个重要组成部分,它负责将类的.class文件从文件系统或者网络中加载到内存中,并转换为对应的Class对象。类加载器的工作流程主要包括加载、验证、准备、解析...

    ClassLoader动态加载dex

    在Android系统中,ClassLoader是Java类加载器的一种实现,它负责加载应用的代码资源,包括类、库等。当我们谈论"ClassLoader动态加载dex"时,实际上是指在Android应用程序运行时,通过自定义的ClassLoader来动态加载...

    Java ClassLoader定制实例

    在实际应用中,我们可以通过反射API来使用自定义ClassLoader加载的类。例如,我们可以创建一个`Class`对象,然后调用`newInstance()`方法来创建该类的实例。 总结来说,Java ClassLoader的定制是一项强大的技术,它...

    classloader类加载器_基于java类的加载方式详解

    比如,如果用户尝试使用Application ClassLoader加载rt.jar中的类,这个请求会被委派到Extension ClassLoader,最终到达Bootstrap ClassLoader,它会首先检查自己是否已经加载了这个类,如果已经加载,那么就不会...

    java的ClassLoader类加载器机制

    每个类加载器都有其特定的加载范围和优先级,确保了 Java 类的正确加载和使用。 类加载器的工作原理可以分为三个阶段:加载、链接和初始化。在加载阶段,类加载器会查找和加载指定的类。在链接阶段,类加载器会对...

    JAVA ClassLoader 讲解 (类加载器)

    ### Java ClassLoader (类加载器)详解 #### 一、教程提示 如果你正在查看这份文档,在线版中你可以点击下面的任何主题直接跳转到相应的部分。 1. **教程提示** 2. **介绍** 3. **类加载器结构** 4. **编译类加载...

    JVM ClassLoader简析

    ClassLoader是JVM中的一个重要组件,它的主要任务是加载类的二进制数据,转换为Class对象,并供Java应用程序使用。本文将深入浅出地探讨JVM ClassLoader的工作原理和相关知识点。 首先,ClassLoader可以分为三种...

    ClassLoader类加载机制

    现在类加载器在 Web 容器和 OSGi 中得到了广泛的使用。一般来说,Java 应用的开发人员不需要直接同类加载器进行交互。Java 虚拟机默认的行为就已经足够满足大多数情况的需求了。不过如果遇到了需要与类加载器进行...

    ClassLoader(类加载机制)1

    在Java中,类加载器主要有三层:Bootstrap ClassLoader(引导类加载器)、Extension ClassLoader(扩展类加载器)和App ClassLoader(系统类加载器)。Bootstrap ClassLoader负责加载JDK的核心库,Extension ...

    ClassLoader

    通过对`ClassLoader`的基本概念、工作原理、双亲委托机制以及不同类型的类加载器的了解,我们可以更好地理解Java类加载的过程及其背后的设计哲学。这对于深入理解Java虚拟机的内部机制以及开发高质量的应用程序都至...

    Java中ClassLoader类加载学习总结

    ClassLoader类是一个抽象类,实际在使用时候会写个子类,这个方法会按照需要被重写,来完成业务需要的加载过程。 知识点六:findClass方法 findClass方法是ClassLoader类的核心方法,该方法会尝试加载指定的类,...

    ClassLoader运行机制 自己写的

    在Java虚拟机(JVM)中,类加载器(ClassLoader)是至关重要的组成部分,它负责查找和加载类的字节码文件。理解ClassLoader的工作机制对于深入掌握Java应用程序的运行至关重要。这里我们将详细讨论ClassLoader的运行...

    Tomcat加载顺序

    System ClassLoader通常被称为应用程序类加载器,它会从`CLASSPATH`环境变量指定的路径加载类库,以及`$CATALINA_HOME/common/classes`、`$CATALINA_HOME/common/lib`下的类和jar包。这里的类库可以被所有web应用...

    定义ClassLoader调用外部jar包

    默认情况下,Java使用系统ClassLoader(Bootstrap ClassLoader)加载JDK核心库,然后是Extension ClassLoader加载扩展库,最后是App ClassLoader加载应用类路径(ClassPath)下的类。当这些默认ClassLoader无法满足...

Global site tag (gtag.js) - Google Analytics