class.getClassLoader().getResource(xxx)是啥意思啊?最后这个xxx和这个类有啥关系?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了class.getClassLoader().getResource(xxx)是啥意思啊?最后这个xxx和这个类有啥关系?相关的知识,希望对你有一定的参考价值。

URL logFileURL = UltraCollectUtil.class.getClassLoader().getResource(fileName);
看了一下网上说的,是获取一个资源,但是后面的fileName是什么呢?一个类怎么可能有资源呢?他们两个有什么关系?是不是前面的UltraCollectUtil可以随便换成任何类啊?

这个类和这个方法没有直接的关系,只是当后面的fileName是一个相对路径的时候,就会在当前这个ULTraCollectUtil这个类的当前位置开始查找资源文件,如果是个绝对路径的话,那前面的类是任意的Java类都可以了,因为.class.getClassLoader()是为了获得一个类加载器,用来加载classpath下的.class文件而已。
getResource返回的是一个URL对象,不要简单的认为是这个资源的绝对地址,这是一个Java中封装的对象,你可以去看看相关的API,里面有很多方法可以获取你当前资源文件的信息的。
另外,提醒一下,很少是单独用上面这个URL对象的,一般是通过这个URL对象来构造Java中的FIle对象以及Icon对象等等,这是一些参考的代码,希望对你有帮助,谢谢
File file3 = new File(Test.class.getClassLoader().getResource("javaapplication/file3.txt").getFile());

String icon = "../image/1.gif ";
button.setIcon(new ImageIcon(getClass() .getResource(icon)));
参考技术A

fileName是一个相对路径的时候,就会在当前这个ULTraCollectUtil这个类的当前位置开始查找资源文件,如果是个绝对路径的话,那前面的类是任意的Java类都可以了,因为.class.getClassLoader()是为了获得一个类加载器,用来加载classpath下的.class文件而已。
getResource返回的是一个URL对象,不要简单的认为是这个资源的绝对地址,这是一个Java中封装的对象,你可以去看看相关的API,里面有很多方法可以获取你当前资源文件的信息的。
另外,提醒一下,很少是单独用上面这个URL对象的,一般是通过这个URL对象来构造Java中的FIle对象以及Icon对象等等.
File file3 = new File(Test.class.getClassLoader().getResource("javaapplication/file3.txt").getFile());

String icon = "../image/1.gif ";
button.setIcon(new ImageIcon(getClass() .getResource(icon)));

参考技术B 这里的最终结果是返回fileName的所在路劲。你可以通过getResource(String filename)这个方法去查看javaAPI追问

我用任何一个类 都能这样做吗? 这个类和这个文件有什么关系啊?

看不懂那个api ...

追答

这个类和这个方法没有直接的关系,你可以用任何一个类

this.class.getClassLoader().getResourceAsStream与this.class.getResourceAsStream

本文转自:http://xixinfei.iteye.com/blog/1256291

this.getClass().getClassLoader().getResource("template"); 
  首先,调用对象的getClass()方法是获得对象当前的类类型,这部分数据存在方法区中,而后在类类型上调用getClassLoader()方法是得到当前类型的类加载器,我们知道在Java中所有的类都是通过加载器加载到虚拟机中的,而且类加载器之间存在父子关系,就是子知道父,父不知道子,这样不同的子加载的类型之间是无法访问的(虽然它们都被放在方法区中),所以在这里通过当前类的加载器来加载资源也就是保证是和类类型同一个加载器加载的。 
最后调用了类加载器的getResourceAsStream()方法来加载资源。

====================================

JAVA运行时,首先会在指定的类路径下(classpath路径下)搜索JAVA编译后的字节码文件(class文件),然后通过类加载器加载到虚拟机中。 DBConn.class.getClassLoader().getResourceAsStream("database.properties")
1、DBConn.class得到表示DBConn类的Class对象,请参照JDK中对Class的说明http://wenku.baidu.com/view/1fa5e8ebe009581b6bd9ebe1.html
2、通过Class的getClassLoader方法取得加载DBConn类的类加载器对象ClassLoader。
3、调用ClassLoader的getResourceAsStream方法从类加载路径取得文件的输入流(会通过当前的ClassLoader的findResource方法查找指定文件),请参照:http://download.oracle.com/javase/1.5.0/docs/api/java/lang/ClassLoader.html#getResourceAsStream%28java.lang.String%29

====================================

下面的JdbcUtils.class后面少了个()吗?应该是都可以

   Properties prop = new Properties();
   prop.load(JdbcUtils.class.getClassLoader().getResourceAsStream("db.properties"));
   String driver = prop.getProperty("driver");
   Class.forName(driver);

====================================

  1. 关于ClassName.class.getClassLoader的几点说明.    
  2. 经常希望通过ClassName.class.getClassLoader().getResourceAsStream(““)来取得properties文件.通常:ClassName.class.getClassLoader().getResourceAsStream(““)取得的是WEB-INF的下级目录,比如ClassName.class.getClassLoader().getResourceAsStream(“db.properties“).在Tomcat中,可以通过增加”../”来取得上层目录,即WEB-INF目录,这样就可以把properties放在WEB-INF中统一管理。但是WLS不识别”../”。   
  3. 另外一种土办法,就是不返回classLoader,直接ClassName.class.getResourceAsStream()。然后通过多个”../”(小于6个)来返回相应的上级目录。   
  4. 当然,如果类扩展了HttpServlet,可以通过getServletContext().getRealPath("/")来取得Web部署目录的绝对路径。

====================================

因此,直接调用 this.getClass().getResourceAsStream(String name);获取流,静态化方法中则使用ClassLoader.getSystemResourceAsStream(String name); 。

====================================

在JDK中,getResourceAsStream是这样定义的:查找具有给定名称的资源。查找与给定类相关的资源的规则是通过定义类的 class loader 实现的。 
因为我是用txt文件当作字典,它存在一个叫dict.aspactword的包下,这样一来,编译后的文件会储存在classPath下,而不是在src下,在动态向字典添加词的时候,classPath下的txt字典没有改变,相对在getResourceAsStream的时候,拿到的自然不是最新的字典,由此感叹,在classPath下如果有不需要改变的文件,在读取时用getResourceAsStream可以保持系统良好的统一性和可移植性,但是在需要改变它们的时候,一定注意修改的路径是classPath下的文件,否则就直接用文件系统的位置来维护你所需要的文件吧

============================================================================================================

 

常见的有以下两种获取资源文件的方法:

 

方法一: App.class.getClassLoader().getResourceAsStream(String name)

 

Returns an input stream for reading the specified resource.

The search order is described in the documentation for getResource(String).

 

默认从classpath中找文件,name不能带“/”,否则会抛空指针

 

方法二: App.class.getResourceAsStream(String name)

 

查找资源通过给定名称,查询资源的规则与给定的类的class load来实现,这个方法由类的loader来执行,如果这个类由bootstrap加载,那么方法由ClassLoader.getSystemResourceAsStream代理执行。

 

代理之前,绝对的资源名称通过传入的name参数以下算法进行构造:

 

如果name以"/"开头,那么绝对路径是/后边跟的名字

如果name不是以"/"开头,那么绝对路径是package名"."换成“/”以后再加name,例如:

 

com.abc.App就是/com/abc/App/name

 

============================================================================================================

另,可参考另一篇文章:Class.getResource和ClassLoader.getResource的区别分析

在Java中获取资源的时候,经常用到Class.getResource和ClassLoader.getResource,本文给大家说一下这两者方法在获取资源文件的路径差异。
Class.getResource(String path)
path不以‘/‘开头时,默认是从此类所在的包下取资源;path以‘/‘开头时,则是从项目的ClassPath根下获取资源。在这里‘/‘表示ClassPath
JDK设置这样的规则,是很好理解的,path不以‘/‘开头时,我们就能获取与当前类所在的路径相同的资源文件,而以‘/‘开头时可以获取ClassPath根下任意路径的资源。
如下所示的例子:

 

 

运行结果为:
file:/D:/work_space/java/bin/net/swiftlet/
file:/D:/work_space/java/bin/

 

Class.getClassLoader().getResource(String path)
path不能以‘/‘开头时,path是指类加载器的加载范围,在资源加载的过程中,使用的逐级向上委托的形式加载的,‘/‘表示Boot ClassLoader中的加载范围,因为这个类加载器是C++实现的,所以加载范围为null。如下所示:

 

 

运行结果为:
file:/D:/work_space/java/bin/
null
从上面可以看出:
class.getResource("/") == class.getClassLoader().getResource("")
其实,Class.getResource和ClassLoader.getResource本质上是一样的,都是使用ClassLoader.getResource加载资源的。下面请看一下jdk的Class源码:

 

 

从上面就可以看才出来:Class.getResource和ClassLoader.getResource本质上是一样的。至于为什么Class.getResource(String path)中path可以‘/‘开头,是因为在name = resolveName(name);进行了处理:

 

 

 



















以上是关于class.getClassLoader().getResource(xxx)是啥意思啊?最后这个xxx和这个类有啥关系?的主要内容,如果未能解决你的问题,请参考以下文章

Java中getResourceAsStream的用法

Java中getResourceAsStream的用法

URL myURL=MyClass.class.getClassLoader().getResource(fileName);

比较Class.getResource与Class.getClassLoader().getResource两种方式读取资源文件

Idea配置文件的读取

class.getClassLoader().getResource(xxx)是啥意思啊?最后这个xxx和这个类有啥关系?