当前位置:天才代写 > tutorial > JAVA 教程 > 如安在Java中利用ClassLoader载入类、文件和web资源等各类资源

如安在Java中利用ClassLoader载入类、文件和web资源等各类资源

2017-11-02 08:00 星期四 所属: JAVA 教程 浏览:505

副标题#e#

ClassLoader主要对类的请求提供处事,当JVM需要某类时,它按照名称向ClassLoader要求这个类,然后由ClassLoader返回这个类的class工具。

ClassLoader认真载入系统的所有资源(Class,文件,图片,来自网络的字节约等),通过ClassLoader从而将资源载入JVM 中。每个class都有一个引用,指向本身的ClassLoader。

1. 得到ClassLoader的几种要领

可以通过如下3种要领获得ClassLoader :

this.getClass.getClassLoader();  // 利用当前类的ClassLoader   
      
Thread.currentThread().getContextClassLoader();  // 利用当前线程的ClassLoader   
      
ClassLoader.getSystemClassLoader();  // 利用系统ClassLoader,即系统的进口点所利用的ClassLoader。

注:system ClassLoader与根ClassLoader并纷歧样。JVM下system ClassLoader凡是为App ClassLoader。

2. 用ClassLoader载入资源的几种要领

所有资源都通过ClassLoader载入到JVM里,那么在载入资源时虽然可以利用ClassLoader,只是对付差异的资源还可以利用一些此外方法载入,譬喻对付类可以直接new,对付文件可以直接做IO等。

2.1 类的载入方法

假设有类A和类B,A在其要领里需要实例化B,载入类大概的要领有3种。对付载入类的环境,用户需要知道B类的完整名字(包罗包名,譬喻"com.alexia.B")

1. 利用Class静态要领 Class.forName

Class cls = Class.forName("com.alexia.B");  
 B b = (B)cls.newInstance();

2. 利用ClassLoader  

/* Step 1. Get ClassLoader */  
ClassLoader cl = this.getClass.getClassLoader();;  // 如何得到ClassLoader参考1  
      
/* Step 2. Load the class */  
Class cls = cl.loadClass("com.alexia.B"); // 利用第一步获得的ClassLoader来载入B  
         
/* Step 3. new instance */
B b = (B)cls.newInstance(); // 有B的类获得一个B的实例

3. 直接new

B b = new B();

注:有人心里大概会想,对付类的载入方法我们城市选择最简朴的第3种方法,前两种方法完全是多余。

实则否则,直接new的方法也是有范围的,举个最简朴的例子:Java中有包名的类怎么引用默认包中的类?虽然说这个是因为有包名的类不能直接用new引用默认包中的类,那么怎么办呢?谜底是利用反射机制,纵然用第一种方法来加载类(详细请看这里)。并且,用new()和用newInstance()建设类的实例是差异的,主要区别简朴描写如下:

从JVM的角度看,我们利用要害字new建设一个类的时候,这个类可以没有被加载。可是利用newInstance()要领的时候,就必需担保:

(1)这个类已经加载;

(2)这个类已经链接了(即为静态域分派存储空间,而且假如必需的话将理会这个类建设的对其他类的所有引用)。而完成上面两个步调的正是Class的静态要领forName()所完成的,这个静态要领挪用了启动类加载器,即加载javaAPI的谁人加载器。

可以看出,newInstance()实际上是把new这个方法解析为两步,即首先挪用Class加载要领加载某个类,然后实例化。这样分步的长处是显而易见的。我们可以在挪用class的静态加载要领forName时得到更好的机动性,提供应了一种降耦的手段。

查察本栏目


#p#副标题#e#

2.2 文件的载入方法(譬喻设置文件等)

假设在com.alexia.A类里想读取文件夹 /com/alexia/config 里的文件sys.properties,读取文件可以通过绝对路径或相对路径,绝对路径很简朴,在Windows下以盘号开始,在Unix下以"/"开始。对付相对路径,其相对值是相对付ClassLoader的,因为ClassLoader是一棵树,所以这个相对路径和ClassLoader树上的任何一个ClassLoader相比拟力后可以找到文件,那么文件就可以找到。文件有以下三种加载方法:
1. 直接用IO流读取

/** 
 * 假设当前位置是 "C:/test",通过执行如下呼吁来运行A "java com.aleixa.A" 
 * 1. 在措施里可以利用绝对路径,Windows下的绝对路径以盘号开始,Unix下以"/"开始 
 * 2. 也可以利用相对路径,相对路径前面没有"/" 
 * 因为我们在 "C:/test" 目次下执行措施,措施进口点是"C:/test",相对路径就 
 * 是 "com/alexia/config/sys.properties" 
 * (例子中,当前措施的ClassLoader是App ClassLoader,system ClassLoader = 当前的 
 * 措施的ClassLoader,进口点是"C:/test") 
 * 对付ClassLoader树,假如文件在jdk lib下,或在jdk lib/ext下,或在情况变量里, 
 * 都可以通过相对路径"sys.properties"找到,lib下的文件最先被找到 
 */
File f = new File("C:/test/com/aleixa/config/sys.properties"); // 利用绝对路径  
//File f = new File("com/alexia/config/sys.properties"); // 利用相对路径  
InputStream is = new FileInputStream(f);

#p#分页标题#e#

2. 利用ClassLoader

/** 
 * 因为有3种要领获得ClassLoader,对应有如下3种ClassLoader要领读取文件 
 * 利用的路径是相对付这个ClassLoader的谁人点的相对路径,此处只能利用相对路径 
 */
InputStream is = null;  
is = this.getClass().getClassLoader().getResourceAsStream(  
       "com/alexia/config/sys.properties"); //要领1  
//is = Thread.currentThread().getContextClassLoader().getResourceAsStream(  
       "com/alexia/config/sys.properties"); //要领2  
//is = ClassLoader.getSystemResourceAsStream("com/alexia/config/sys.properties"); //要领3

3. 利用ResourceBundle

ResourceBundle bundle = ResourceBundle.getBoundle("com.alexia.config.sys");

这种用法凡是用来载入用户的设置文件,关于ResourceBunlde更具体的用法请参考其他文档。

注:假如是属性设置文件,也可以通过java.util.Properties.load(is)将内容读到Properties里,Properties默认认为is的编码是ISO-8859-1,假如设置文件长短英文的,大概呈现乱码问题。

总结:有如下3种途径来载入文件

1. 绝对路径 —> IO

2. 相对路径 —> IO

           —> ClassLoader

3. 资源绑缚 —> ResourceBundle

2.3 web资源的载入方法

在web应用里虽然也可以利用ClassLoader来载入资源,但更常用的环境是利用ServletContext,如下是web目次布局

ContextRoot

|- JSP、HTML、Image等各类文件

|- [WEB-INF]

   |- web.xml

   |- [lib] Web用到的JAR文件

     |- [classes] 类文件

用户措施凡是在classes目次下,假如想读取classes目次里的文件,可以利用ClassLoader,假如想读取其他的文件,一般利用ServletContext.getResource()。

假如利用ServletContext.getResource(path)要领,路径必需以"/"开始,路径被表明成相对付ContextRoot的路径,此处载入文件的要领和ClassLoader差异,举例"/WEB-INF/web.xml","/download/WebExAgent.rar"

查察本栏目

 

    关键字:

天才代写-代写联系方式