本文的目的重温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中都有此配置文件,使用不当会造成困惑:两个都加载了,到底哪个是在使用的;如果出错,哪个导致了出错)
分享到:
相关推荐
在Java编程语言中,ClassLoader是核心组件之一,它负责加载类到JVM(Java虚拟机)中执行。本文将深入探讨ClassLoader的工作原理和类加载机制,帮助开发者理解这个至关重要的概念。 1. 类加载机制概述 Java的类加载...
总之,理解并掌握如何使用ClassLoader动态加载Class是Java开发中的重要技能,它能帮助我们构建更灵活、可扩展的系统。在实现过程中,要兼顾性能、安全和可维护性,合理设计类加载策略,确保代码的高效运行。
【图解版】深入分析ClassLoader类加载工作机制,从原理到JVM的装载过程,详情分析了ClassLoader加载类以及自定义类加载器的过程,不可用于商业用途,如有版权问题,请联系删除!
该电子书详细介绍了java虚拟机类加载机制,对于深入理解jvm工作原理有很好的帮助作用,对于初学java,有一定工作经验的小伙伴来说是一本提高自身java素养,夯实自己java基本技能的“葵花宝典”。
在Java中,Classloader是加载类的关键组件,它负责查找、加载和初始化字节码文件。自定义Classloader允许开发者根据特定需求定制类的加载逻辑,例如加密类文件、隔离不同版本的库或者动态加载代码。本文将深入探讨...
以下是对ClassLoader API的使用和自定义的详细说明。 首先,我们来看ClassLoader的基本概念。在Java中,每个类都是由一个ClassLoader实例加载的。系统中存在三种基本的ClassLoader: 1. Bootstrap ClassLoader:这...
Java中的类加载器(ClassLoader)是Java虚拟机(JVM)的一个重要组成部分,它负责将类的.class文件从文件系统或者网络中加载到内存中,并转换为对应的Class对象。类加载器的工作流程主要包括加载、验证、准备、解析...
在Android系统中,ClassLoader是Java类加载器的一种实现,它负责加载应用的代码资源,包括类、库等。当我们谈论"ClassLoader动态加载dex"时,实际上是指在Android应用程序运行时,通过自定义的ClassLoader来动态加载...
在实际应用中,我们可以通过反射API来使用自定义ClassLoader加载的类。例如,我们可以创建一个`Class`对象,然后调用`newInstance()`方法来创建该类的实例。 总结来说,Java ClassLoader的定制是一项强大的技术,它...
比如,如果用户尝试使用Application ClassLoader加载rt.jar中的类,这个请求会被委派到Extension ClassLoader,最终到达Bootstrap ClassLoader,它会首先检查自己是否已经加载了这个类,如果已经加载,那么就不会...
每个类加载器都有其特定的加载范围和优先级,确保了 Java 类的正确加载和使用。 类加载器的工作原理可以分为三个阶段:加载、链接和初始化。在加载阶段,类加载器会查找和加载指定的类。在链接阶段,类加载器会对...
### Java ClassLoader (类加载器)详解 #### 一、教程提示 如果你正在查看这份文档,在线版中你可以点击下面的任何主题直接跳转到相应的部分。 1. **教程提示** 2. **介绍** 3. **类加载器结构** 4. **编译类加载...
ClassLoader是JVM中的一个重要组件,它的主要任务是加载类的二进制数据,转换为Class对象,并供Java应用程序使用。本文将深入浅出地探讨JVM ClassLoader的工作原理和相关知识点。 首先,ClassLoader可以分为三种...
现在类加载器在 Web 容器和 OSGi 中得到了广泛的使用。一般来说,Java 应用的开发人员不需要直接同类加载器进行交互。Java 虚拟机默认的行为就已经足够满足大多数情况的需求了。不过如果遇到了需要与类加载器进行...
在Java中,类加载器主要有三层:Bootstrap ClassLoader(引导类加载器)、Extension ClassLoader(扩展类加载器)和App ClassLoader(系统类加载器)。Bootstrap ClassLoader负责加载JDK的核心库,Extension ...
通过对`ClassLoader`的基本概念、工作原理、双亲委托机制以及不同类型的类加载器的了解,我们可以更好地理解Java类加载的过程及其背后的设计哲学。这对于深入理解Java虚拟机的内部机制以及开发高质量的应用程序都至...
ClassLoader类是一个抽象类,实际在使用时候会写个子类,这个方法会按照需要被重写,来完成业务需要的加载过程。 知识点六:findClass方法 findClass方法是ClassLoader类的核心方法,该方法会尝试加载指定的类,...
在Java虚拟机(JVM)中,类加载器(ClassLoader)是至关重要的组成部分,它负责查找和加载类的字节码文件。理解ClassLoader的工作机制对于深入掌握Java应用程序的运行至关重要。这里我们将详细讨论ClassLoader的运行...
System ClassLoader通常被称为应用程序类加载器,它会从`CLASSPATH`环境变量指定的路径加载类库,以及`$CATALINA_HOME/common/classes`、`$CATALINA_HOME/common/lib`下的类和jar包。这里的类库可以被所有web应用...
默认情况下,Java使用系统ClassLoader(Bootstrap ClassLoader)加载JDK核心库,然后是Extension ClassLoader加载扩展库,最后是App ClassLoader加载应用类路径(ClassPath)下的类。当这些默认ClassLoader无法满足...