1. 程式人生 > >jdbc 基本操作

jdbc 基本操作

mark 選擇 rop println ring 屬性 觀察 res cati

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 基本操作