在学习java的一段时间内,一直碰到Class.getResource()、ClassLoader.getResource()和this.class.getClassLoader()这三个方法。用到之后,百度一下,明白了什么意思了,但是过了一段时间之后,又忘了。今天就把它记录下来吧!!
java是面向对象语言,面向对象的语言的宗旨就是万事万物皆对象,那么类、类里面的属性和方法都是对象。java里面的所有的类都是Class类的对象,this.class是获得这个类相对于Class类的对象。
getClassLoader()是获得这个类对象的加载器。只有Class类才有getClassLoader()方法;java设计Class这个类,用于虚拟机对类的管理。当一个类被虚拟机装载完毕的时候,就会创建一个Class类的实例,对于类A就是A.class,对于类B就是B.class。 Class类也提供了许多方法来获取类的信息。要知道,类的装载器分为 "启动类装载器 "、"用户定义装载器 "。它不止一种,Class类需要保存这些信息,getClassLoader()是用来获取这个信息的。
Java中取资源时,经常用到Class.getResource和ClassLoader.getResource,这里来看看他们在取资源文件时候的路径问题。
如下图在包testClass下创建一个text.xml文件。读取其位置
public class testMain
{
public static void main(String[] args)
{
// 当前类(class)所在的包目录
System.out.println(testMain.class.getResource(""));
// class path根目录
System.out.println(testMain.class.getResource("/"));
System.out.println(testMain.class.getResource("text.xml"));
System.out.println("++++++++++++++++++++++++++++");
System.out.println(testMain.class.getClassLoader());
System.out.println(testMain.class.getClassLoader().getResource(""));
System.out.println(testMain.class.getClassLoader().getResource("/"));
System.out.println(testMain.class.getClassLoader().getResource("text.xml"));
}
}
其运行结果如下图:
有结果可以看出来:testMain.class.getClassLoader()获得是一个对象,testMain.class.getResource("/")和testMain.class.getClassLoader().getResource("")获得是testMain.class所在的目录,如下图所示:
使用Class.getClassLoader().getResourse(String path)该怎么实现呢?
public static void main(String[] args)
{
// 当前类(class)所在的包目录
System.out.println(testMain.class.getResource(""));
// class path根目录
System.out.println(testMain.class.getResource("/"));
System.out.println(testMain.class.getResource("text.xml"));
System.out.println("++++++++++++++++++++++++++++");
System.out.println(testMain.class.getClassLoader());
System.out.println(testMain.class.getClassLoader().getResource(""));
System.out.println(testMain.class.getClassLoader().getResource("/"));
System.out.println(testMain.class.getClassLoader().getResource("text.xml"));
testMain t = new testMain();
System.out.println(t.getClass().getClassLoader().getResource(""));
System.out.println(t.getClass().getClassLoader().getResource("text3.xml"));
System.out.println(t.getClass().getClassLoader().getResource("testClass/text.xml"));
System.out.println(t.getClass().getClassLoader().getResource("basick/text2.xml"));
}
运行结果: