Class的getResource与ClassLoader的getResource路径/问题
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                Class的getResource与ClassLoader的getResource路径/问题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                
                            
                            
                            一、Class的getResource(String path):URL 
1、path 不以’/'開頭時,默認是從此類所在的包下取資源;
2、path 以’/'開頭時,則是從ClassPath根下獲取; 
 System.out.println(Test.class.getResource(""));
System.out.println(Test.class.getResource("/")); 
 
file:/E:/java/Test/bin/cn/
file:/E:/java/Test/bin/ 
 
 
                        
                        
                        ?
二、類加載器ClassLoader的getResource(String path)
1、path 不以'/'開頭
? ? ?path是指類加載器的加載范圍,在資源加載的過程中,使用的逐級向上委托的形式加載的,加載范圍是從整個ClassPath范圍。
2、path 以'/'開頭
? ? ?'/'表示Boot ClassLoader中的加載范圍,因為這個類加載器是C++實現的,所以加載范圍為null。
System.out.println(Test.class.getClassLoader().getResource("")); System.out.println(Test.class.getClassLoader().getResource("/"));? file:/E:/java/Test/bin/
? null
?
三、class.getResource("/") 等價于 class.getClassLoader().getResource("")
class.getResource()與classLoader().getResource()最終使用了系統類加載器加載以classpath為根的不帶'/'的路徑進行加載資源
Class的getResource方法源碼
public URL getResource(String name){name = resolveName(name);//將路徑轉換成為classpath根的絕對路徑,不以/開頭ClassLoader cl = getClassLoader0();if (cl==null){// A system class.return ClassLoader.getSystemResource(name);}return cl.getResource(name); }?getClassLoader0方法與resolveName方法
//獲取當前類的類加載器 ClassLoader getClassLoader0(){return classLoader; }//獲取classpath根的絕對路徑,不以/開頭 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; } View CodeClassLoader.getSystemResource方法
public static URL getSystemResource(String name) {//返回委派的系統類加載器。這是默認代表團的父母新的類加載器實例,并通常用于啟動應用程序的類加載器。ClassLoader system = getSystemClassLoader();if (system == null) {return getBootstrapResource(name);//根據根加載器的路徑檢索資源 }return system.getResource(name); } // The class loader for the system private static ClassLoader scl; public static ClassLoader getSystemClassLoader() {initSystemClassLoader();if (scl == null) {return null;}SecurityManager sm = System.getSecurityManager();if (sm != null) {checkClassLoaderPermission(scl, Reflection.getCallerClass());}return scl; } View Code?
ClassLoader.getResource方法源碼
private final ClassLoader parent; public URL getResource(String name) {URL url;//父加載器非nullif (parent != null) {url = parent.getResource(name); //請求父加載器獲取資源} else {url = getBootstrapResource(name); //該類為ExtClassLoader,用其父加載器Bootstrap加載資源 }if (url == null) {url = findResource(name);}return url; } //從虛擬機的內置類加載器查找資源 private static URL getBootstrapResource(String name) {URLClassPath ucp = getBootstrapClassPath();Resource res = ucp.getResource(name); return res != null ? res.getURL() : null; }//返回urlclasspath是用于發現系統資源。 static URLClassPath getBootstrapClassPath() {return sun.misc.Launcher.getBootstrapClassPath(); }?
總結
以上是生活随笔為你收集整理的Class的getResource与ClassLoader的getResource路径/问题的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 知道本地IP地址如何知道IP所在的电脑是
- 下一篇: 最佳玫瑰标识以及如何免费制作自己的标识[
