标签:
就目前的我来说最常用的两种获取路径的方法是
class.getRecource(filename) 和 class.getclassloader.getRecource(filename)
这两者的区别其实很简单就是路径的时候有点不同,这里主要讲两个参数,其他的路径获取,其他的话在根据相对路径逐一查找就行了
class.getRecource(filename):
参数"/" | 表示获取根目录; (即我们常用到的bin目录【字节码文件存放的目录】 |
" " | 表示获取当前类路径 |
class.getclassloader.getRecourc(filename):
参数“/” | 是null值得,因为底层是c++写的 |
“ “ | 便是获取根目录(即bin目录) |
好了,具体怎么来实现,
通过一个例子来了解吧
对于这个bin目录下的1.txt怎么获取呢
String url=test6.class.getResource("/1.txt").getFile(); url1=test6.class.getClassLoader().getResource("1.txt").getFile(); 结果:/F:/CheckOut/workspacefuxi/Thread_1/bin/1.txt
String url=test6.class.getResource("").getFile(); CheckOut/workspacefuxi/Thread_1/bin/Test1/
那为什么会出现这种情况呢?
那我们来分析一下他的源码,这是class.getRecource()的源码:
public java.net.URL getResource(String name) { name = resolveName(name); ClassLoader cl = getClassLoader0(); if (cl==null) { // A system class. return ClassLoader.getSystemResource(name); } return cl.getResource(name); }
这里就可以很明确的看到最终他还是要执行cl.getResource(name),等于就是执行了class.getClassLoader().getRecource()方法
所以来说这两者实际上是一致的
来为什么在获取路径上的时候出现了分歧呢,来让我来在看一下resolveName(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; }
最后呢我还想说说getclassLoader()的作用:
这是网上的一段比较好的解释:
Java是面向对象语言,面向对象的语言的宗旨就是万事万物皆对象,那么类也是一个对象,类里面的属性和方法也是对象。Java里面的所
有的类都是Class类的对象,这个this.class是获得这个类相对于Class类的对象。后面的方法是获得这个类对象的加载器。
只有Class类才有getClassLoader()方法呀~ 可以这么想,我们平时讲述某某类,但是我们并没有说这个类怎么和虚拟机打交道,虚拟机怎么识别这
个类.总不能全靠字符串吧. 所以呢java就设计了Class这个类.用于虚拟机对类的管理.当一个类被虚拟机装载完毕的时候,就会创建一个Class类
的实例,对于类A就是A.class,对于类B就是B.class. Class类也提供了许多方法来获取类的信息. 要知道,类的装载器分为 "启动类装载器 ", "用
户定义装载器 ".它不止一种 Class类需要保存这些信息. getClassLoader()是用来获取这个信息的
标签:
原文地址:http://www.cnblogs.com/yaobolove/p/5453280.html