- 浏览: 470205 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
chexiazi:
一样的xml代码 报这个错 <ns1:XMLFault ...
CXF 通过用户名和密码进行验证 -
di1984HIT:
谢谢啊 ~~~
通过JavaCompiler进行编译java文件(转载) -
aa00aa00:
'%${userName}%' 这种是可以的,是可以模糊查询的 ...
mybatis 模糊查询 -
一棵杨柳的地盘:
我把你的代码不了一遍 但是汇报错首先:static { ...
CXF 通过用户名和密码进行验证 -
shangmin1990:
转 IntelliJ IDEA 编辑器生成 Hibernate 实体映射文件
本文的目的重温ClassLoader、ContextClassLoader加载使用,展示可能忽略的东西,虽然内容不是多么复杂,但是出现一些问题而不明白原因时,会让人"抓狂"。
执行,打印内容关键罗列如下:
从加载路径可以看出
(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中都有此配置文件,使用不当会造成困惑:两个都加载了,到底哪个是在使用的;如果出错,哪个导致了出错)
- 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"));
- }
- }
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
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 位运算总结
2018-10-23 11:14 0<div class="iteye-blog- ... -
java sort 排序中的自然序排序总结
2018-10-23 11:07 5817<div class="iteye-blo ... -
Java内存分析工具
2012-11-24 11:16 2254Java运行时数据区包含:Method area, heap, ... -
转 StringUtils.isBlank()函数(分享一下)
2012-02-15 10:23 2988StringUtils的isBlank与isEmply ... -
jquery 使用ajax 提交整个表单的数据
2012-01-06 14:52 5919在使用Struts开发项目的时候发现很爽的一件事就是可以不使用 ... -
struts2 通配符
2011-12-31 16:25 1286在使用struts2时,如果想定义action的话可以这样做 ... -
Maven Web项目部署到Tomcat下
2011-12-30 17:28 19548通过Maven来搭建项目是 ... -
velocity与servlet的整合
2011-12-28 21:07 1458第一天学习velocity,参考别人的blog写了一个与Se ... -
ibatis 与spring3整合
2011-12-28 13:01 5729spring与ibates整合,使用 ... -
ibatis 入门
2011-12-28 12:48 1272昨天学习了一下ibatis ... -
转 JTA简介
2011-12-26 17:47 1063Java Transaction API(Java事务 ... -
转 IntelliJ IDEA 编辑器生成 Hibernate 实体映射文件
2011-12-23 16:03 23388很多人不知道怎么用 IntelliJ IDEA 编辑器 ... -
转 IntelliJ IDEA 使用基础篇 Java IDE编辑器
2011-12-23 15:02 8520IntelliJ IDE ... -
转在CXF中用JAXB数据绑定支持Map类型
2011-12-05 16:38 5232一些java类型不能自然映射成xml,例如,HashMap ... -
cxf wsdltojava 构造方法报错
2011-12-05 14:23 1324I'm marking this as "n ... -
(转)Struts2学习笔记--Internationalization
2011-11-21 18:13 1333Struts2 的国际化 ======== ... -
单例模式
2011-11-18 20:47 1015单例模式(SINGLETON):单例模式确保某一个类只有一个实 ... -
类加载的顺序
2011-11-17 21:40 1193写道 package com.wang; public cl ... -
socket实现客户端与客户端通信
2011-11-17 19:34 3045最近闲来无聊,看了一下socket通信,实现了一个最简版的客户 ... -
接口设计的 11 种原则
2011-05-02 21:02 27447种设计坏味道 1.僵化性: 很难对系统进行改动,因为每个改动 ...
相关推荐
双亲委派模型使得系统类(如java.*开头的类)由Bootstrap ClassLoader加载,而用户自定义类由应用程序类加载器(AppClassLoader)加载。这避免了类的冲突,保持了系统类库的稳定性。但有时我们可能需要打破这种模型...
在Android系统中,类加载器(ClassLoader)是一个至关重要的组件,它负责查找并加载应用程序中的类。类加载器的工作机制是Java虚拟机(JVM)的一部分,但在Android中,由于其特殊的运行环境,类加载器的功能和使用...
三、上下文类加载器(ContextClassLoader) 1. 定义:在多线程环境中,每个线程都有一个与之关联的ClassLoader,称为上下文类加载器。通常,线程的上下文类加载器由创建该线程的代码设置,用于加载线程中使用的特定...
此外,"classloader-playground"还可能包含对线程上下文类加载器(Thread Context ClassLoader)的理解和使用。线程上下文类加载器主要用于解决应用程序类加载问题,尤其是在服务提供者接口(SPI)中,允许用户...
### Tomcat中的ClassLoader详解 #### 一、引言 在深入了解Tomcat的工作原理时,一个重要的组成部分就是其...理解这些概念有助于开发者更好地管理部署在Tomcat上的Web应用程序,并解决可能出现的类加载冲突等问题。
此外,Microcontainer的类加载层也支持OSGi的类加载概念,如束(Bundle)和上下文(Context),这为构建模块化和可插拔的应用程序提供了基础。尽管JBoss 5的类加载层并不完全遵循OSGi规范,但它吸取了OSGi的优点,...
除了这三种预定义的类加载器,Java还提供了一种特殊的**线程上下文类加载器(Thread Context ClassLoader)**,它允许在特定线程中加载类时使用非默认的类加载器。这在插件框架和OSGi等动态部署环境中尤其有用。 ...
类加载器遵循双亲委派模型,这意味着当一个类加载器尝试加载类时,它首先会将请求委托给其父类加载器,直到到达顶层的Bootstrap ClassLoader,如果父类加载器无法找到该类,子类加载器才会尝试自己加载。 在Tomcat...
在整个过程中,我们需要注意权限问题,特别是从Android 6.0(API级别23)开始,动态加载可能需要请求 `READ_EXTERNAL_STORAGE` 和 `WRITE_EXTERNAL_STORAGE` 权限。 此外,Android的类加载机制遵循双亲委派模型,...
当应用启动时,Android系统会使用`ClassLoader`来加载这些`.dex`文件并执行其中的代码。 `ClassLoader`是Java和安卓系统中的一个重要组件,它的主要职责是加载类到Java虚拟机(JVM)或者 Dalvik 虚拟机(DVM)中。...
DexClassLoader是ClassLoader的一个子类,它的主要任务是加载.dex或.jar文件中的类。在Android中,通常每个应用都有一个默认的ClassLoader,它会加载APK内的classes.dex文件。然而,如果我们需要在运行时加载额外的....
如果类还未加载,它会通过当前线程的上下文类加载器(Context Class Loader)来加载。 2. **类初始化**:除了加载类,`forName`还会执行类的初始化。这意味着静态块会被执行,静态变量会被初始化。 然而,`...
线程上下文类加载器(Thread Context ClassLoader)是一个特殊的角色,它允许在多线程环境中控制类的加载。每个线程都有一个与之关联的类加载器,可以通过Thread.currentThread().getContextClassLoader()获取。这在...
Android中的类加载主要由ClassLoader完成,它遵循双亲委托模型,即先尝试从父ClassLoader加载,如果找不到则递归到子ClassLoader。在默认情况下,系统会使用PathClassLoader加载应用程序的.dex文件。 为了在内存中...
如果当前线程的ClassLoader无法获取到资源,Spring会转而使用加载org.springframework.util.ClassUtils类的ClassLoader。 在Spring加载配置文件时,我们需要注意几个关键点: 1. **不使用通配符**:当配置文件路径...
Android系统默认使用DexClassLoader来加载应用中的类,但如果我们想加载外部APK中的类,我们需要自定义ClassLoader。首先,我们需要获取到目标APK的路径,这可以通过Context.getPackageCodePath()或者File类来完成。...
在Android开发中,动态加载JAR(Java Archive)...总结,Android动态加载JAR是一种强大的技术,能带来诸多好处,但同时也需要注意安全和兼容性问题。通过合理利用DexClassLoader,开发者可以构建更灵活、可扩展的应用。
线程上下文类加载器(Thread Context ClassLoader)是Java提供的一种机制,允许线程在运行时指定一个类加载器,确保类由同一个类加载器加载。这对于应用程序服务器和插件系统尤其有用,因为它允许组件使用自己的类...