ZT文萃

          本博不原創,轉帖自己感興趣那些事人物,什么入眼貼什么,隨心所欲。
          posts - 93, comments - 5, trackbacks - 0, articles - 0
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          Class.getResource()

          Posted on 2014-05-02 15:34 ZT文萃 閱讀(294) 評論(0)  編輯  收藏 所屬分類: 中間件






          查找帶有給定名稱的資源,查找給定類相關的資源的規則是通過定義類的 class loader 實現的。此方法委托給此對象的類加載器。如果此對象通過引導類加載器加載,則此方法將委托給 ClassLoader.getSystemResource(java.lang.String)

          在委托前,使用下面的算法從給定的資源名構造一個絕對資源名:

          • 如果 name'/'  開始,則絕對資源名是 '/' 后面的 name 的一部分。
          • 否則,絕對名具有以下形式:
               modified_package_name/name 

            其中 modified_package_name 是此對象的包名,該名用 '/' 取代了 '.' ('\u002e')。

          Class.getResource(""); 獲取classpath

           

          Class.getResource("JMF.class"); 代表獲取相于類路徑當前包下的SendService.class的類路徑.

          /D:/bak/upload/upload/WebRoot/WEB-INF/classes/jmf/JMF.class-------->打印出的結果

          Class.getResource("/jmf/WebCamSwing.class"); /jmf/WebCamSwing.class->代表相于類路徑的絕對路徑

          file:/D:/bak/upload/upload/WebRoot/WEB-INF/classes/jmf/JMF.class  -------->打印出的結果

           

          我們怎么獲得Object的類路徑:

          Class.getResource("/java/lang/Object.class") 因為Object是通過引導類加載器 (BootStrapClassLoader)加載的,所以此方法通過系統類加載器來查找資料, 所以我們要指定類的絕對路徑/java/lang /Object.class

          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);
              }

           

          我們來看看如何通過系統類加載器來查找Object:

          Class.getClassLoader().getSystemResource("java/lang/Object.class")

           

          打印出來的結果多是:

          jar:file:/E:/Program/Java/jdk1.5.0_15/jre/lib/rt.jar!/java/lang/Object.class

           

          為什么getResource("")前面要加"/",而getSystemResource("")前面不用加呢?

          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;
              }

           

          其實最后還是要把"/"去掉的...

          主站蜘蛛池模板: 新化县| 庆元县| 嫩江县| 古丈县| 广东省| 建昌县| 濮阳县| 东海县| 桐柏县| 安岳县| 金平| 大名县| 馆陶县| 东海县| 通河县| 兰溪市| 台中市| 禄劝| 靖边县| 常宁市| 安庆市| 布尔津县| 福安市| 泊头市| 平凉市| 丹江口市| 顺义区| 萨迦县| 东莞市| 河津市| 江陵县| 西宁市| 长子县| 遵义市| 抚顺县| 光泽县| 崇左市| 石阡县| 宣威市| 澄江县| 永兴县|