ClassLoader 提供了两个方法用于从装载的类路径中取得资源

合集下载

classloader.getresourceasstream(name)原理解析

classloader.getresourceasstream(name)原理解析

ClassLoader.getResourceAsStream(name) 是 Java 中用于从类加载器的类路径上获取资源文件流的方法。

这个方法在读取配置文件、图像、音频等资源时非常有用。

以下是关于该方法工作原理的详细解析:1. 类加载器(ClassLoader)Java 使用类加载器来动态加载 Java 类。

类加载器负责从文件系统、网络或其他来源读取类的字节码,并将其转换为 JVM 可以理解的格式。

Java 中的每个类都是由某个类加载器加载的。

类加载器之间存在父子关系,形成一个树状结构。

通常,每个 Java 应用至少有三个类加载器:引导类加载器(Bootstrap ClassLoader):加载 JDK 中的核心类库,如 ng.* 等。

它不是由 Java 实现的,而是由 JVM 的原生代码实现的。

扩展类加载器(Extension ClassLoader):加载 JDK 的扩展目录(通常是 lib/ext 目录或 JAVA_HOME/jre/lib/ext)中的 JAR 包和类文件。

系统类加载器(System ClassLoader):加载 CLASSPATH 环境变量中指定的类库,它是应用程序默认的类加载器。

2. getResourceAsStream(name) 方法getResourceAsStream(name) 方法用于从类加载器的类路径中查找并返回一个资源的输入流。

资源的名称是相对于类路径的。

资源查找:当调用 getResourceAsStream(name) 方法时,类加载器会按照特定的算法在类路径中查找资源。

它通常首先检查父类加载器是否有该资源,如果没有,再检查自己的资源。

资源名称:资源的名称是相对于“包”的。

例如,如果有一个名为 com.example.MyClass 的类,并且它位于一个名为 MyClass.class 的文件中,那么与该类在同一个目录下的名为config.properties 的文件的资源名称就是 com/example/config.properties。

getclassloader.getresource用法

getclassloader.getresource用法

getclassloader.getresource用法Java语言中的ClassLoader类起到了非常重要的作用,主要用于加载类文件。

在实际的开发中,我们需要加载一些配置文件、资源文件等,这时就可以使用ClassLoader.getResouce()方法来获取这些资源。

本文将深入探讨“getClassLoader.getResouce()”方法的使用方法以及注意事项。

一、ClassLoader的概念ClassLoader是Java中的一个类,它主要用于动态加载类,也可以用于加载其他类型的资源文件。

当Java程序运行时,会默认有一个系统ClassLoader,这个ClassLoader主要用于加载JDK自带的类库和应用程序所在的类和资源。

由于Java的ClassLoader采用的是类似于“双亲委派”模型的机制,这意味着当我们需要加载某个类时,系统会首先从父类ClassLoader中查找是否已经加载了该类,如果父类ClassLoader没有加载该类,则会由当前的ClassLoader自己加载,这样可以避免重复加载。

ClassLoader可以被用户自定义,这样我们就可以利用自定义ClassLoader加载自己的类和资源。

二、ClassLoader.getResource()的使用方法当我们需要加载一些配置文件、资源文件等时,可以使用ClassLoader.getResource()方法来获取。

应该注意的是,ClassLoader.getResouce()方法得到的是资源文件的URL,不是一个普通的文件路径。

下面是示例代码:``` //获取当前类的ClassLoader ClassLoader classLoader = getClass().getClassLoader(); //获取所需要的资源文件的URL URL resourceUrl = classLoader.getResource("config.properties"); ```以上代码中,我们首先获取了当前类的ClassLoader,接着通过ClassLoader.getResource()方法获取了config.properties文件的URL。

java classloader使用

java classloader使用

java classloader使用Java的ClassLoader是Java虚拟机(JVM)在运行时动态加载类的机制之一。

ClassLoader负责将Java字节码转换成可执行的Java类对象,并将其加载到JVM的内存中。

ClassLoader提供了一种机制,使得开发人员可以在运行时动态地加载新的类,并在程序执行过程中改变类的行为。

Java的ClassLoader使用可以参考以下几个方面:1. 类加载的过程:Java类加载器遵循双亲委派模型,即ClassLoader在加载一个类时,首先委派给其父类加载器去加载,只有当父类加载器无法加载时,该加载器才会尝试自己去加载。

这样可以保证类的加载是层级结构的,避免了类的重复加载。

2. 类加载器的种类:Java提供了三种类加载器:引导类加载器(Bootstrap ClassLoader)、扩展类加载器(Extension ClassLoader)和应用类加载器(Application ClassLoader)。

在ClassLoader的使用中,可以根据需要选择合适的类加载器,或者自定义类加载器。

3. 自定义类加载器:Java中提供了自定义类加载器的机制,可以通过继承ClassLoader类来实现。

自定义类加载器可以用于加载一些非标准位置的类文件,或者对已有的类加载行为进行定制化。

4. 类加载器的委派机制:在双亲委派模型中,类加载器首先尝试委派给父类加载器去加载类,只有当父类加载器无法加载时,才会尝试自己加载类。

这样可以确保类的加载是层级结构的,避免了类重复加载。

5. 类加载器的破坏:在某些特殊情况下,可能希望打破双亲委派模型的限制,自定义类加载器可以覆盖loadClass()方法,以实现自己的加载逻辑。

6. 动态加载类:Java的ClassLoader提供了动态加载类的机制,可以在运行时动态地加载新的类。

这对于某些需要根据不同条件加载不同类的场景非常有用。

classloader 范围

classloader 范围

classloader 范围Classloader(类加载器)是Java虚拟机(JVM)的一个重要组成部分,它负责将Java类加载到内存中,以供程序使用。

Classloader的范围是指它在加载类时所涵盖的范围,即它能够加载的类的位置和来源。

在Java中,ClassLoader可以分为三个范围:引导类加载器(Bootstrap ClassLoader)、扩展类加载器(Extension ClassLoader)和应用程序类加载器(Application ClassLoader)。

1. 引导类加载器(Bootstrap ClassLoader):引导类加载器是JVM自身的一部分,它负责加载Java虚拟机自身需要的基础类,如ng包下的类。

引导类加载器是无法被Java代码直接调用或访问的,它是用C++实现的,并由JVM实例初始化。

2. 扩展类加载器(Extension ClassLoader):扩展类加载器用于加载Java的扩展库,它主要负责加载Java平台扩展目录(Java Home/jre/lib/ext)下的JAR文件。

扩展类加载器是由uncher$ExtClassLoader实现的,并由Java标准扩展机制提供。

3. 应用程序类加载器(Application ClassLoader):应用程序类加载器是最常用的类加载器,在Java应用程序中被广泛使用。

它负责加载程序的classpath中的类,包括应用程序自身的类和第三方库的类。

这个类加载器是通过uncher$AppClassLoader实现的。

类加载器的范围决定了类的加载顺序和加载位置。

当一个类被加载时,会首先由引导类加载器进行加载。

如果引导类加载器无法加载该类,会将该请求传递给扩展类加载器。

如果扩展类加载器仍然无法加载,最后轮到应用程序类加载器进行加载。

如果所有的类加载器均无法加载该类,将抛出ClassNotFoundException异常。

classloader的原理,举出应用场景及工作实例

classloader的原理,举出应用场景及工作实例

classloader的原理,举出应用场景及工作实例ClassLoader的原理ClassLoader(类加载器)是Java虚拟机的一个重要组成部分,它负责将Java字节码文件加载到内存中,并生成对应的Java类。

ClassLoader的原理涉及到Java虚拟机的类加载机制,下面将详细介绍ClassLoader的原理、应用场景和工作实例。

ClassLoader的原理主要包括以下几个方面:1. 类加载的过程类加载是指将类的字节码文件加载到内存中,并生成对应的Java类。

类的加载过程可以分为以下几个步骤:(1)加载:通过类的全限定名(例如com.example.MyClass)在文件系统或网络中查找对应的字节码文件,找到后将其读取到内存中。

(2)连接:连接是指将已经加载的类与其他的类、接口或者静态变量进行关联。

连接包括验证、准备和解析三个阶段。

- 验证:验证阶段主要是对字节码文件进行校验,确保其符合Java虚拟机的规范。

- 准备:准备阶段主要是为类的静态变量分配内存,并设置默认值。

- 解析:解析阶段主要是将类、接口或者静态变量与实际内存地址进行关联。

(3)初始化:初始化阶段是类加载的最后一个阶段,主要是执行类的静态代码块和静态变量的初始化。

2. 类加载器的分类Java虚拟机中存在多个不同类型的类加载器,主要分为以下几种:(1)引导类加载器(Bootstrap ClassLoader):负责加载Java 核心类库,它是Java虚拟机自身内嵌的一部分,不同的Java虚拟机实现可能不同。

(2)扩展类加载器(Extension ClassLoader):负责加载Java 扩展类库,一般对应于Java虚拟机的jre/lib/ext目录或java.ext.dirs 系统属性指定的路径。

(3)应用程序类加载器(Application ClassLoader):负责加载应用程序的类,一般对应于CLASSPATH 环境变量指定的路径或者用户自定义的路径。

classloader加载原理

classloader加载原理

classloader加载原理classloader是java中一个比较重要的类加载器,每一个程序和类都会存在一个classloader,classloader有三种主要的工作:加载类的二进制字节流、连接、初始化。

一、Classloader加载机制1、首先classloader会按照特定的方式去搜索类文件,当它找到了相应的类文件之后,它会将这个类文件转换成为二进制字节流,这里涉及到编译程序,classloader会使用编译程序将源程序编译成可执行文件。

2、接下来classloader会将这些二进制字节流存储在内存中,然后classloader会连接这些字节流,这一步是它将这些字节流组装成一个完整的类文件,这里涉及到类的加载,这些加载的类可以被访问,但是它们的代码还未被执行。

3、最后classloader会初始化这些加载的类,这一步就是它将这些类的代码执行,这里classloader会执行所有类变量的初始化,同时也会执行所有静态代码块的内容,最后我们就可以得到一个完整的类文件。

二、Classloader的三种类型1、Bootstrap Classloader:它是用来加载JRE的核心类的,它的实现是C++语言,它的加载范围是从<JAVA_HOME>lib下面开始,这个类加载器不需要程序员编写任何外部类。

2、Extension Classloader:它是用来加载扩展类的,从<JAVA_HOME>libext开始加载,它继承自Bootstrap Classloader,这种类加载器也不需要程序员手动编写任何外部类。

3、Application Classloader:它是用来加载程序类的,它继承自Extension Classloader,它从ClassPath(来自系统变量或者命令行参数)所指定的路径中加载类,但是它不会加载扩展类。

三、Classloader安全机制1、安全性验证:Classloader在加载类的时候会先验证这个类文件,检查它是否符合class文件格式,其次classloader会过滤掉由它本身加载的不安全的类,这涉及到安全管理器的配置,例如:可以设置它只能加载特定的域名下的类文件。

classloadergetresource方法详解

classloadergetresource方法详解

classloadergetresource方法详解在Java语言中,ClassLoader类是一个重要的类,它在Java虚拟机中用来加载Java类文件或者其他相关资源文件。

相信很多Java开发者都会用到ClassLoader类的getResource()方法来获取资源文件,那么今天我们就来详细讲解一下ClassLoader中的getResource()方法。

一、ClassLoader定义ClassLoader是一个作用在Java虚拟机的类,它用来加载类文件或者其他的资源文件。

Java虚拟机通过该类的实例,通过调用ClassLoader中的findClass()方法,加载指定包名称的类文件到虚拟机运行环境中,从而形成Java代码执行的最后环节。

二、getResource()介绍getResource()是ng.ClassLoader中的一个基础函数,它用于在指定的class loader的classpath中搜索得到指定name的资源。

getResource()方法可以用URL对象的形式返回位于给定名称的文件和文件夹的资源。

它在类路径中查找一个具有给定名称的资源,并且返回的是资源的URL对象。

由于该方法是父类加载器的方法,加载资源时会自动委托给其父类加载器。

当找不到资源时返回的将是null值。

三、getResource()与getResourceAsStream()方法区别但是,有些Java开发者会有疑问,在获取资源时,是使用getResource()好还是使用getResourceAsStream()方法更好呢?其实,这两者之间的区别是非常细微的,主要有两个方面:首先是返回值,getResource()方法返回一个URL对象,表示类加载器可以在给定的路径上找到的资源,而getResourceAsStream()方法返回一个输入流对象,表示类加载器可以在给定的路径上找到的资源的数据。

另外,getResourceAsStream()方法中的路径名必须以“/”开头,不然将会找不到指定文件。

classloader类加载器的用法

classloader类加载器的用法

classloader类加载器的用法Classloader类加载器是Java中负责加载类的重要组件,主要用于在运行时动态加载类。

它的主要用法包括:
1. 加载类:通过指定类的名称或类文件的路径,使用类加载器加载类。

可以使用Class.forName()方法或ClassLoader.loadClass()方法加载类。

2. 查找类:在类路径中搜索指定的类文件,找到并返回类文件的路径或URL。

可以使用ClassLoader.getResource()方法或
ClassLoader.getResourceAsStream()方法来查找类文件。

3. 定义类:将类的字节码加载到内存中,并在运行时动态定义类。

可以使用ClassLoader.defineClass()方法或ClassLoader.defineClass()方法来定义类。

4. 解析类:将类的字节码解析为可执行的代码,并链接类的引用。

可以使用ClassLoader.resolveClass()方法来解析类。

5. 控制类的加载:可以通过自定义类加载器来控制类的加载过程,例如限制只能加载特定的类或从特定的位置加载类。

6. 类的卸载:当不再需要某个类时,可以通过卸载类加载器来清除相关的类。

可以使用ClassLoader.clearAssertionStatus()方法来卸载类。

需要注意的是,使用ClassLoader加载的类会在内存中留有对应的Class对象,这些Class对象会在运行时占用一定的内存空间。

因此,在设计使用ClassLoader 加载大量类的应用程序时,要注意合理使用ClassLoader和控制类的加载。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

ClassLoader 提供了两个方法用于从装载的类路径中取得资源:
public URL getResource (String name);
public InputStream getResourceAsStream (String name);
这里name是资源的类路径,它是相对与“/”根路径下的位置。

getResource 得到的是一个URL对象来定位资源,而getResourceAsStream取得该资源输入流的引用保证程序可以从正确的位置抽取数据。

但是真正使用的不是ClassLoader的这两个方法,而是Class的getResource和getResourceAsStream方法,因为Class对象可以从你的类得到(如YourClass.class或 YourClass.getClass()),而ClassLoader则需要再调用一次YourClass.getClassLoader()方法,不过根据JDK文档的说法,Class对象的这两个方法其实是“委托”(delegate)给装载它的ClassLoader 来做的,所以只需要使用 Class对象的这两个方法就可以了。

因此,直接调用 this.getClass()。

getResourceAsStream(String name) ;获取流,静态化方法中则使用ClassLoader.getSystemResourceAsStream (String name) ; 。

下面是一些得到classpath和当前类的绝对路径的一些方法。

你可能需要使用其中的一些方法来得到你需要的资源的绝对路径。

1.this.getClass()。

getResource("")
得到的是当前类class文件的URI目录。

不包括自己!
如:file:/D:/workspace/jbpmtest3/bin/com/test/
this.getClass()。

getResource("/")。

getPath();
如:D:/workspace/jbpmtest3/bin/com/test/
2.this.getClass()。

getResource("/")
得到的是当前的classpath的绝对URI路径。

如:file:/D:/workspace/jbpmtest3/bin/
3.this.getClass() .getClassLoader()。

getResource("")
得到的也是当前ClassPath的绝对URI路径。

如:file:/D:/workspace/jbpmtest3/bin/
4.ClassLoader.getSystemResource("")
得到的也是当前ClassPath的绝对URI路径。

如:file:/D:/workspace/jbpmtest3/bin/
5.Thread.currentThread()。

getContextClassLoader ()。

getResource ("")
得到的也是当前ClassPath的绝对URI路径。

如:file:/D:/workspace/jbpmtest3/bin/
6.ServletActionContext.getServletContext()。

getRealPath(“/”)
Web应用程序中,得到Web应用程序的根目录的绝对路径。

这样,我们只
需要提供相对于Web应用程序根目录的路径,就可以构建出定位资源的绝对路径。

如:file:
/D:/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtp webapps/WebProject
注意点:
1.尽量不要使用相对于System.getProperty("user.dir")当前用户目录
的相对路径。

这是一颗定时炸弹,随时可能要你的命。

2.尽量使用URI形式的绝对路径资源。

它可以很容易的转变为URI,URL,File对象。

3. 尽量使用相对classpath的相对路径。

不要使用绝对路径。

使用上面ClassLoaderUtil类的public static URL getExtendResource(String relativePath)方法已经能够使用相对于classpath的相对路径定位所有位置的资源。

4.绝对不要使用硬编码的绝对路径。

因为,我们完全可以使用ClassLoader 类的getResource("")方法得到当前classpath的绝对路径。

如果你一定要指定一个绝对路径,那么使用配置文件,也比硬编码要好得多!
获得CLASSPATH之外路径的方法:
URL base = this.getClass()。

getResource(""); //先获得本类的所在位置,如/home/popeye/testjava/build/classes/net/
String path = new File(base.getFile(),"……/……/……/"+name)。

getCanonicalPath(); //就可以得到/home/popeye/testjava/name
另外,如果从ANT启动程序,this.getClass()。

getResource("")取出来的比较怪,直接用JAVA命令行调试就可成功。

FreeMarker的Configuration对象中设置模板路径有以下三种方法:
setDirectoryForTemplateLoading(new File
("/var/tomcat/webapp/project/WEB-INFO/template/"))
getFreemarkerCfg()。

setServletContextForTemplateLoading(arg0, arg1);
setClassForTemplateLoading(clazz, pathPrefix)。

相关文档
最新文档