- 浏览: 1249755 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (193)
- ant/maven (6)
- algorithm (5)
- tomcat/weblogic/jboss (6)
- javascript/jquery (13)
- java (33)
- flex/flash (0)
- JPA/Hibernate/myBatis (18)
- java concurrent (7)
- test (2)
- windows/linux (6)
- java collection (7)
- design pattern (2)
- life/health (3)
- database (12)
- IDE (4)
- spring/ejb (20)
- html/css/ckeditor (7)
- jsp/servlet (3)
- java io (13)
- java security (4)
- jni (0)
- svn/git (2)
- english (2)
- java jmx (1)
- xml (1)
- struts/springmvc (9)
- middleware (2)
- cache (1)
- cglib (3)
最新评论
-
jlotusYo:
博主,真感谢。
Java 密码扩展无限制权限策略文件 -
senninha:
这个。。是api说明吧。。
ScheduledExecutorService 源码分析 -
zoutao2008:
请问大文件如何处理?按你这种方式的话,文件超过200M时就会报 ...
hessian系列之二:上传文件 -
lwj1113:
lwj1113 写道谢谢博主这么细致的demo;在系列五中通过 ...
myBatis系列之五:与Spring3集成 -
lwj1113:
谢谢博主这么细致的demo;在系列五中通过testng测试类跑 ...
myBatis系列之五:与Spring3集成
加载资源可以用绝对路径和相对路径,但都有局限性。用硬编码的方式不好。
比较好的方式是绝对+相对方式。即绝对路径就是应用程序安装的路径,相对路径是资源文件相对于程序根目录的路径。
java.lang.ClassLoader不仅可以加载类到内存中,还可以加载其它的资源。
1. ClassLoader.getResourceAsStream
比方说配置文件,很多时候都是放在源代码路径下的,这样就可以直接使用ClassLoader
这里的conf.properties是放在com.john.basis包下的,编译的时候IDE会帮我们把资源文件拷贝到生成目录。
ClassLoader的getResourceAsStream的操作分成两个部分:getResource()和openStream()。
getSystemResourceAsStream亦是如此。
下面就以getResourceAsStream为例:
如果parent存在,则从parent中getResource();否则从启动引导路径中去找。
如果url还是null,则调用自定义的findResource()去找。
2. Class.getResourceAsStream
jdk帮我们简化了上面的代码,如果conf.properties是和MyClass在同一个目录下,那么可以直接调用类的getResourceAsStream方法:
其实Class类的getResourceAsStream(name)也是调用了ClassLoader.getResourceAsStream(name)方法的:
如果当前的ClassLoader为null,就调用ClassLoader.getSystemResourceAsStream(name)方法。
这里对name进行了预处理:
如果name不是以'/'开头:
替换包名中的.为/,将处理后的字符串作为前缀加到name上去。在这里就是:"com/john/basis" + "/" + "conf.properties"
否则,认为该文件存放在代码根目录,去除首字符'/'。
比较好的方式是绝对+相对方式。即绝对路径就是应用程序安装的路径,相对路径是资源文件相对于程序根目录的路径。
java.lang.ClassLoader不仅可以加载类到内存中,还可以加载其它的资源。
1. ClassLoader.getResourceAsStream
比方说配置文件,很多时候都是放在源代码路径下的,这样就可以直接使用ClassLoader
package com.john.basis; public class MyClass { InputStream inputStream = MyClass.class.getClassLoader().getResourceAsStream("com/john/basis/conf.properties"); }
这里的conf.properties是放在com.john.basis包下的,编译的时候IDE会帮我们把资源文件拷贝到生成目录。
ClassLoader的getResourceAsStream的操作分成两个部分:getResource()和openStream()。
getSystemResourceAsStream亦是如此。
下面就以getResourceAsStream为例:
public abstract class ClassLoader { public InputStream getResourceAsStream(String name) { URL url = getResource(name); try { return url != null ? url.openStream() : null; } catch (IOException e) { return null; } } 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; } // Sub classes need to override this method protected URL findResource(String name) { return null; } }
如果parent存在,则从parent中getResource();否则从启动引导路径中去找。
如果url还是null,则调用自定义的findResource()去找。
2. Class.getResourceAsStream
jdk帮我们简化了上面的代码,如果conf.properties是和MyClass在同一个目录下,那么可以直接调用类的getResourceAsStream方法:
InputStream inputStream = MyClass.class.getResourceAsStream("conf.properties");
其实Class类的getResourceAsStream(name)也是调用了ClassLoader.getResourceAsStream(name)方法的:
public InputStream getResourceAsStream(String name) { name = resolveName(name); ClassLoader cl = getClassLoader0(); if (cl==null) { // A system class. return ClassLoader.getSystemResourceAsStream(name); } return cl.getResourceAsStream(name); }
如果当前的ClassLoader为null,就调用ClassLoader.getSystemResourceAsStream(name)方法。
这里对name进行了预处理:
private String resolveName(String name) { if (name == null) { return name; } if (!name.startsWith("/")) { Class c = this; while (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; }
如果name不是以'/'开头:
替换包名中的.为/,将处理后的字符串作为前缀加到name上去。在这里就是:"com/john/basis" + "/" + "conf.properties"
否则,认为该文件存放在代码根目录,去除首字符'/'。
评论
2 楼
czj4451
2013-06-02
ClassLoader的getResource()方法的返回值就是java.net.URL类型啊。
1 楼
劳黑炭
2013-05-29
我读取的内容需要以url形式,怎么从inputStream转为URL
发表评论
-
Netty系列之二、Netty组件
2014-10-12 19:55 0Netty主要由以下几个组件构成: Bootstrap o ... -
Netty系列之二:传输方式
2014-09-17 22:35 0NIO (Non-blocking I/O) io.netty ... -
Java正则表达式实例
2014-08-25 22:50 1942题目: 有两个文件context.txt和words ... -
quartz系列之九:存储
2014-08-05 13:16 0这里以1.8.x为例: 任务 ... -
JVM 四种引用
2014-04-24 19:56 17731. 强引用 指通过普通 ... -
Proxy 源码分析
2014-04-21 10:47 0public class Proxy implements ... -
NIO UDP 编程
2014-04-17 23:18 4257和TCP的SocketChannel类似,UDP的Dat ... -
Matcher 源码分析
2014-04-15 14:45 0首先看下接口: public interface Matc ... -
BTrace 使用
2014-03-20 18:03 0简介 Btrace (Byte Trace)是Sun推出的一款 ... -
NIO Socket 编程
2014-04-11 22:48 1664Java NIO (Nonblocking IO)解决了常规I ... -
hessian系列之二:上传文件
2014-02-17 17:16 6227hessian较早版本通过 byte[] 进行文件传输;4.0 ... -
hessian系列之三:与Spring集成
2014-02-17 20:21 17897Spring封装了hessian客户端和服务端的通用代码,把实 ... -
hessian系列之一:Hello world
2014-01-06 20:51 2300Hessian是一个Web Service的轻量级二进制协议, ... -
XStream:自定义转换器
2013-12-30 22:47 0XStream是一款不错的oxm (Object-XML ma ... -
Http连接工具类
2013-12-28 16:13 0public class HttpConnUtil { ... -
Integer源码分析
2013-12-26 19:59 0private static String toU ... -
全排序
2013-12-23 21:02 0写一个函数, 如 foo(String str), 打印出 s ... -
logback系列之四:输出日志到不同文件
2013-12-03 16:25 69041logback系列之一:输出日志到控制台 logback系列之 ... -
Properties 源码分析
2013-11-26 10:32 01. Properties类扩展了Hashtable,用来保存 ... -
logback系列之三:输出日志到文件(滚动)
2013-11-16 23:37 64429logback系列之一:输出日志到控制台 logback系列之 ...
相关推荐
类加载器(`ClassLoader`)负责将编译后的`.class`文件加载到Java虚拟机(JVM)中执行,而类路径(`ClassPath`)则是指明了这些`.class`文件的位置。本文主要围绕Java类加载器和类路径展开讨论,以加深对Java运行时...
Java 中的 ClassLoader 提供了一系列的方法来完成加载类的这个职责,例如加载 Java 应用所需的资源,如图像文件和配置文件等。ClassLoader 还负责加载 Java 应用程序所需的类文件,以便在程序运行时可以正确地调用...
扩展类加载器是一个Java类,它在运行时被Bootstrap ClassLoader加载,并且它同样会加载扩展API中的类。 3. Application ClassLoader(应用程序类加载器):也被称为System ClassLoader(系统类加载器),它负责加载...
Java ClassLoader是一个核心的Java运行时组件,负责加载类到Java虚拟机(JVM)中。它是Java平台的独特特性,因为它允许动态加载类,增强了软件的可扩展性和灵活性。这篇博文(虽然链接不可用)可能深入探讨了...
Java ClassLoader机制是Java虚拟机(JVM)中一个至关重要的组成部分,它的主要任务是将类的.class文件加载到JVM中,使得程序能够运行。ClassLoader不仅负责类的加载,还涉及类的验证、初始化等一系列过程。理解...
本文探讨了Java虚拟机(JVM)中的一个重要特性:动态类加载(Dynamic Class Loading)。这一机制为Java平台提供了强大的能力,允许在运行时安装软件组件,例如从网络下载Applet并加载到Web浏览器中。尽管其他系统也...
总之,通过Java的静态代码块和类加载器,我们可以有效地管理和加载资源文件,特别是属性配置文件,确保在程序启动时即完成初始化工作,提升应用性能。这种技术在大型复杂系统中尤其常见,因为它能够保证配置的正确性...
- **Extension ClassLoader**:这个ClassLoader加载Java扩展包中的类。 - **System/App ClassLoader**:这个ClassLoader加载应用程序类路径中的类。 #### 三、自定义ClassLoader实践 为了更深入地理解ClassLoader...
《深入Java虚拟机_ClassLoader》是一本专注于Java虚拟机(JVM)中ClassLoader部分的专著,旨在帮助读者深入理解Java程序如何加载、链接和初始化类。ClassLoader是Java平台核心特性的一部分,它负责查找和加载类到JVM...
《深入理解Java类加载器:基于classloader-playground开源项目》 在Java世界里,类加载器(ClassLoader)是理解JVM工作原理的关键一环。它负责将字节码文件(.class)从磁盘、网络或其他数据源加载到内存,并转化为...
Java类加载器(ClassLoader)在Java运行环境中扮演着至关重要的角色。它负责将类的字节码加载到Java虚拟机(JVM)中,使得程序能够运行。ClassLoader是一个抽象类,它的主要任务是根据类的全限定名(即包名加类名)...
2. **Extension ClassLoader**:扩展类加载器,负责加载`<JAVA_HOME>\lib\ext`目录下的JAR包,或者被`-Djava.ext.dirs`指定的路径中的类。 3. **System ClassLoader**:也称为应用类加载器,负责加载`CLASSPATH`...
Java URLClassLoader 是Java标准库中的一个类加载器,它允许我们动态地从指定的URL位置加载类和资源。这个功能在开发插件系统、热部署或者处理多种版本库的场景中非常有用。从JDK 1.2开始,`java.net.URLClassLoader...
在Android系统中,ClassLoader是Java类加载器的一种实现,它负责加载应用的代码资源,包括类、库等。当我们谈论"ClassLoader动态加载dex"时,实际上是指在Android应用程序运行时,通过自定义的ClassLoader来动态加载...
在深入探讨Java类加载器(ClassLoader)之前,我们首先需要了解它在Java运行时系统中的核心作用。类加载器是Java虚拟机(JVM)的一个关键组成部分,负责查找、加载和链接类文件到JVM中。它的存在使得Java应用程序...
在Java环境中,类加载器(ClassLoader)是负责加载Java类到JVM的重要组件。它不仅实现了类的加载机制,还支持了动态加载与卸载的功能。本文将通过淘宝网的实际应用场景,深入讲解ClassLoaders的工作原理及其在实际...
然而,如果类是由不同的ClassLoader加载的,即使它们在相同的包内,也可能彼此不可见。这就是所谓的“类隔离”。 在一些高级应用中,如插件系统或动态加载,开发者可能需要自定义ClassLoader来加载特定的类或资源。...
在Java编程语言中,动态加载jar包是一种常见的需求,它允许程序在运行时根据需要加载新的功能或更新现有的模块,增强了软件的灵活性和可扩展性。动态加载jar包技术主要涉及Java的反射机制、类加载器和插件系统。下面...
在Java应用开发中,特别是Web应用程序的构建过程中,资源文件(如配置文件、属性文件等)的加载是必不可少的一部分。本文将重点探讨Java环境下不同方式下的文件加载方法,尤其关注在Spring框架下的实践与应用。 ###...
在Java编程中,有时我们需要动态地加载外部JAR文件,并执行其中特定的类方法,这在插件系统、模块化应用或动态扩展性需求中尤为常见。本篇将详细讲解如何实现这一目标。 首先,理解JAR(Java Archive)文件是Java...