jdbc 基本操作
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] view plain copy
URL fileURL = CollectionUtil.class.getClassLoader().getResource(fileName);
這個類和這個方法沒有直接的關系,只是當後面的fileName是一個相對路徑的時候,就會在這個CollectionUtil類的當前位置開始查找資源文件;如果是個絕對路徑的話,那前面的類是任意的Java類都可以了,因為.class.getClassLoader()是為了獲得一個類加載器,用來加載classpath下的.class文件而已。getResource返回的是一個URL對象,不要簡單的認為是這個資源的絕對地址,這是一個Java中封裝的對象。
另外,提醒一下,很少是單獨用上面這個URL對象的,一般是通過這個URL對象來構造Java中的FIle對象以及Icon對象等等,參考代碼如下:
[java] view plain copy
File file3 = new File(Test.class.getClassLoader().getResource("javaapplication/file3.txt").getFile()); String icon = "../image/1.gif "; button.setIcon(new ImageIcon(getClass() .getResource(icon)));
Class.getResource和ClassLoader.getResource解析
Java中取資源時,經常用到Class.getResource和ClassLoader.getResource,這裏來看看他們在取資源文件時候的路徑問題。
Class.getResource()
[java] view plain copy
Class.getResouece(String path);
path不以“/”開頭時,默認是從此類所在的包下取資源;path以“/”開頭時,則是從ClassPath根下獲取;
觀察如下示例:
文件結構如下:
如果我們想在Test.java中分別取1~3.xml文件,該怎麽實現?
[java] view plain copy
package testpackage;
public class TestMain {
public static void main(String[] args) {
// 當前類(class)所在的包目錄
System.out.println(TestMain.class.getResource(""));
// class path根目錄
System.out.println(TestMain.class.getResource("/"));
// TestMain.class在<bin>/testpackage包中
// 1.properties 在bin目錄(class根目錄)
System.out.println(TestMain.class.getResource("/1.properties"));
// TestMain.class在<bin>/testpackage包中
// 2.properties 在<bin>/testpackage包中
System.out.println(TestMain.class.getResource("2.properties"));
// TestMain.class在<bin>/testpackage包中
// 3.properties 在<bin>/testpackage.subpackage包中
System.out.println(TestMain.class.getResource("subpackage/3.properties"));
}
}
Class.getResource()和Class.getResourceAsStream()使用時,在路徑選擇上是一樣的。
Class.getClassLoader().getResource(String path)
path不能以“/”開頭時,是從ClassPath根下獲取;
[java] view plain copy
package testpackage;
public class TestMain {
public static void main(String[] args) {
TestMain t = new TestMain();
System.out.println(t.getClass());
System.out.println(t.getClass().getClassLoader());
System.out.println(t.getClass().getClassLoader().getResource(""));
System.out.println(t.getClass().getClassLoader().getResource("/"));//null
}
}
運行結果:
[java] view plain copy
class testpackage.TestMain
sun.misc.Launcher$AppClassLoader@1fb8ee3
file:/E:/workspace/Test/bin/
null
還是上面的文件結構,使用Class.getClassLoader().getResourse(String path)該怎麽實現呢?
[java] view plain copy
package testpackage;
public class Test {
public static void main(String[] args) {
TestMain t = new TestMain();
System.out.println(t.getClass().getClassLoader().getResource(""));
System.out.println(t.getClass().getClassLoader().getResource("1.properties"));
System.out.println(t.getClass().getClassLoader().getResource("testpackage/2.properties"));
System.out.println(t.getClass().getClassLoader().getResource("testpackage/subpackage/3.properties"));
}
}
Class.getClassLoader().getResource()和Class.getClassLoader().getResourceStream()使用時,在路徑選擇上也是一樣的。
jdbc 基本操作