`

java中ClassLoader加载资源

    博客分类:
  • java
阅读更多
加载资源可以用绝对路径和相对路径,但都有局限性。用硬编码的方式不好。

比较好的方式是绝对+相对方式。即绝对路径就是应用程序安装的路径,相对路径是资源文件相对于程序根目录的路径。

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

相关推荐

    java classloader classpath 张孝祥

    类加载器(`ClassLoader`)负责将编译后的`.class`文件加载到Java虚拟机(JVM)中执行,而类路径(`ClassPath`)则是指明了这些`.class`文件的位置。本文主要围绕Java类加载器和类路径展开讨论,以加深对Java运行时...

    java中ClassLoader

    Java 中的 ClassLoader 提供了一系列的方法来完成加载类的这个职责,例如加载 Java 应用所需的资源,如图像文件和配置文件等。ClassLoader 还负责加载 Java 应用程序所需的类文件,以便在程序运行时可以正确地调用...

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

    扩展类加载器是一个Java类,它在运行时被Bootstrap ClassLoader加载,并且它同样会加载扩展API中的类。 3. Application ClassLoader(应用程序类加载器):也被称为System ClassLoader(系统类加载器),它负责加载...

    java classloader

    Java ClassLoader是一个核心的Java运行时组件,负责加载类到Java虚拟机(JVM)中。它是Java平台的独特特性,因为它允许动态加载类,增强了软件的可扩展性和灵活性。这篇博文(虽然链接不可用)可能深入探讨了...

    java ClassLoader机制及其在OSGi中的应用

    Java ClassLoader机制是Java虚拟机(JVM)中一个至关重要的组成部分,它的主要任务是将类的.class文件加载到JVM中,使得程序能够运行。ClassLoader不仅负责类的加载,还涉及类的验证、初始化等一系列过程。理解...

    Java ClassLoader原理

    本文探讨了Java虚拟机(JVM)中的一个重要特性:动态类加载(Dynamic Class Loading)。这一机制为Java平台提供了强大的能力,允许在运行时安装软件组件,例如从网络下载Applet并加载到Web浏览器中。尽管其他系统也...

    java 静态代码块通过类加载器获取资源文件例子

    总之,通过Java的静态代码块和类加载器,我们可以有效地管理和加载资源文件,特别是属性配置文件,确保在程序启动时即完成初始化工作,提升应用性能。这种技术在大型复杂系统中尤其常见,因为它能够保证配置的正确性...

    Understanding the Java ClassLoader

    - **Extension ClassLoader**:这个ClassLoader加载Java扩展包中的类。 - **System/App ClassLoader**:这个ClassLoader加载应用程序类路径中的类。 #### 三、自定义ClassLoader实践 为了更深入地理解ClassLoader...

    深入Java虚拟机_ClassLoader

    《深入Java虚拟机_ClassLoader》是一本专注于Java虚拟机(JVM)中ClassLoader部分的专著,旨在帮助读者深入理解Java程序如何加载、链接和初始化类。ClassLoader是Java平台核心特性的一部分,它负责查找和加载类到JVM...

    classloader-playground, 一个简单的java依赖隔离容器类.zip

    《深入理解Java类加载器:基于classloader-playground开源项目》 在Java世界里,类加载器(ClassLoader)是理解JVM工作原理的关键一环。它负责将字节码文件(.class)从磁盘、网络或其他数据源加载到内存,并转化为...

    深入java虚拟机(七)深入源码看java类加载器ClassLoader 1

    Java类加载器(ClassLoader)在Java运行环境中扮演着至关重要的角色。它负责将类的字节码加载到Java虚拟机(JVM)中,使得程序能够运行。ClassLoader是一个抽象类,它的主要任务是根据类的全限定名(即包名加类名)...

    自定义Java类加载器

    2. **Extension ClassLoader**:扩展类加载器,负责加载`<JAVA_HOME>\lib\ext`目录下的JAR包,或者被`-Djava.ext.dirs`指定的路径中的类。 3. **System ClassLoader**:也称为应用类加载器,负责加载`CLASSPATH`...

    Java URLClassLoader动态加载jar包1

    Java URLClassLoader 是Java标准库中的一个类加载器,它允许我们动态地从指定的URL位置加载类和资源。这个功能在开发插件系统、热部署或者处理多种版本库的场景中非常有用。从JDK 1.2开始,`java.net.URLClassLoader...

    ClassLoader动态加载dex

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

    Understanding the Java ClassLoader.pdf

    在深入探讨Java类加载器(ClassLoader)之前,我们首先需要了解它在Java运行时系统中的核心作用。类加载器是Java虚拟机(JVM)的一个关键组成部分,负责查找、加载和链接类文件到JVM中。它的存在使得Java应用程序...

    java classloader讲义-淘宝网

    在Java环境中,类加载器(ClassLoader)是负责加载Java类到JVM的重要组件。它不仅实现了类的加载机制,还支持了动态加载与卸载的功能。本文将通过淘宝网的实际应用场景,深入讲解ClassLoaders的工作原理及其在实际...

    【IT十八掌徐培成】Java基础第25天-04.classLoader-系统资源-不可见类访问.zip

    然而,如果类是由不同的ClassLoader加载的,即使它们在相同的包内,也可能彼此不可见。这就是所谓的“类隔离”。 在一些高级应用中,如插件系统或动态加载,开发者可能需要自定义ClassLoader来加载特定的类或资源。...

    java 动态加载jar包

    在Java编程语言中,动态加载jar包是一种常见的需求,它允许程序在运行时根据需要加载新的功能或更新现有的模块,增强了软件的灵活性和可扩展性。动态加载jar包技术主要涉及Java的反射机制、类加载器和插件系统。下面...

    java文件的加载

    在Java应用开发中,特别是Web应用程序的构建过程中,资源文件(如配置文件、属性文件等)的加载是必不可少的一部分。本文将重点探讨Java环境下不同方式下的文件加载方法,尤其关注在Spring框架下的实践与应用。 ###...

    java 类从哪个jar包加载的

    Java类是从JAR(Java Archive)包中加载的,JAR文件是Java平台特有的归档格式,用于收集多个类文件、相关的元数据和其他资源(如图像文件或配置文件)到一个单一的文件中,方便分发和运行。 首先,我们来理解一下...

Global site tag (gtag.js) - Google Analytics