ClassLoader
.Java源文件被Java编译器编译成.class字节码文件,ClassLoader负责从.class文件中读取字节码并转换成java.lang.Class类的实例(对应一个Java类),并存储在JVM内存中;结合反射通过Class类实例的 newInstance方法创建Class类实例对应的Java对象实例。
类加载器的职责:
1 根据类的名称找到或生成类对应的.class字节码文件
2 加载Java应用程序需要用到的资源,如:图片文件,配置文件,文件目录等
由于类加载器可以加载资源,所以可以通过类加载器获取到资源的信息,如资源的路径等
但是首先需要获取项目中加载类的加载器实例
如何在项目中获取当前类加载器:
Thread.currentThread().getContextClassLoader();
ClassLoader类获取指定路径资源的方法:
其中的name参数是 / 隔开的
The name of a resource is a '<tt>/</tt>'-separated path name that identifies the resource.
/**
* Finds the resource with the given name. A resource is some data
* (images, audio, text, etc) that can be accessed by class code in a way
* that is independent of the location of the code.
*
* <p> The name of a resource is a '<tt>/</tt>'-separated path name that
* identifies the resource.
*
* <p> This method will first search the parent class loader for the
* resource; if the parent is <tt>null</tt> the path of the class loader
* built-in to the virtual machine is searched. That failing, this method
* will invoke {@link #findResource(String)} to find the resource. </p>
*
* @apiNote When overriding this method it is recommended that an
* implementation ensures that any delegation is consistent with the {@link
* #getResources(java.lang.String) getResources(String)} method.
*
* @param name
* The resource name
*
* @return A <tt>URL</tt> object for reading the resource, or
* <tt>null</tt> if the resource could not be found or the invoker
* doesn't have adequate privileges to get the resource.
*
* @since 1.1
*/
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;
}
网友评论