2012-03-06 121 views
1

問題是下一步:我從here拿到基類加載程序代碼。但是我的classLoader從某個角度來說是特定的,它必須能夠從文件系統加載類(讓我們來看看WinOS),所以在classLoader中必須使用一些方法,它設置一個路徑(文件系統上的一個目錄),我們將加載類(只有* .class,沒有罐子)。這裏是代碼,它從一個鏈接修改裝載機(你可以看到,只有loadClass的修改),但它不能正常工作:自定義類加載程序問題

public void setAdditionalPath(String dir) { 
      if(dir == null) { 
       throw new NullPointerException(""); 
      } 

      this.Path = dir; 
     } 

     public Loader(){ 
       super(Loader.class.getClassLoader()); 
     } 


     public Class loadClass(String className) throws ClassNotFoundException { 
      if(Path.length() != 0) { 
      File file = new File(Path); 

      try { 
       // Convert File to an URL 

     URL url = file.toURL();   
       URL[] urls = new URL[]{url}; 

       // Create a new class loader with the directory 
       ClassLoader cl = new URLClassLoader(urls); 


       ClassLoader c = cl.getSystemClassLoader(); 
       Class cls = c.loadClass(className); 
       return cls; 

      } catch (MalformedURLException e) { 

      } catch (ClassNotFoundException e) { 

      } 

     } 
      return findClass(Path); 
     } 

我會感激,如果有人可以幫助:)

+0

什麼錯誤(S)。用很少的信息來調試它可能很困難。 – 2012-03-06 21:18:13

+0

@Legend首先我設置一個目錄的路徑值,其中有一些類。然後我用這個目錄中的一個類調用classloader,但是它在這些行的某些行中返回一個NPE(NullPointerException)'ClassLoader cl = new URLClassLoader(urls); ClassLoader c = cl.getSystemClassLoader(); Class cls = c.loadClass(className);' – pikachu 2012-03-06 21:36:49

+0

我不能說我的解決方案是正確的。我想要獲得的主要結果是我的類加載器將能夠從我在該方法中設置的文件目錄中加載類,否則將調用父類加載器。 – pikachu 2012-03-06 22:07:36

回答

1

您可以使用提供的框架java.net.URLClassLoader。沒有必要寫你自己的。它支持從目錄和JAR文件加載類。

任何以'/'結尾的URL都被認爲是指向一個目錄。 否則,假定該URL是指根據需要打開的將爲 的JAR文件。

它還支持父類加載器。如果這個類加載器不符合你的要求,也許你可以更詳細地指定你需要的東西。在任何情況下,您都可以查看源代碼,並根據此類派生自己的類加載器類。

這裏是簡短的代碼片段工作應該demostrate如何通過名稱從一個URLClassLoader加載類:,如果有的話,你得到

ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader(); 

    // This URL for a directory will be searched *recursively* 
    URL classes = 
     new URL("file:///D:/code/myCustomClassesAreUnderThisFolder/"); 

    ClassLoader custom = 
     new URLClassLoader(new URL[] { classes }, systemClassLoader); 

    // this class should be loaded from your directory 
    Class<?> clazz = custom.loadClass("my.custom.class.Name"); 
    // this class will be loaded as well, because you specified the system 
    // class loader as the parent 
    Class<?> clazzString = custom.loadClass("java.lang.String"); 
+0

因此它是NPE,因爲我以不正確的格式設置路徑?我會盡力的,謝謝! – pikachu 2012-03-08 06:47:32

+0

我不知道,但你的例子也返回NPE。 – pikachu 2012-03-10 19:38:05

+0

在單元測試中測試過,運行得很好。在完整的堆棧跟蹤後編輯您的問題。 – Strelok 2012-03-11 11:43:29