2012-03-06 7 views
1

問題は次です:私はhereから基本クラスローダーコードを取った。私のclassLoaderは、ファイルシステムからクラスをロードできる必要があります(WinOSを使用しましょう)。クラスローダーでは、パス(ファイルシステム上のディレクトリ)を設定するsetAdditionalPath()メソッドでなければなりません。クラスをロードします(* .class、jarファイルはありません)。こちらのリンクからローダーを変更するコードは、(あなただけの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

。これを少しでも情報なしでデバッグするのは難しいでしょう。 –

+0

@Legendまず、パス値をディレクトリで設定します。ここにはいくつかのクラスがあります。次に、このディレクトリにあるクラスを使ってクラスローダーを呼び出しますが、これらの行のいくつかでNPE(NullPointerException)を返します。 'ClassLoader cl = new URLClassLoader(urls); ClassLoader c = cl.getSystemClassLoader(); クラスcls = c.loadClass(className); ' – pikachu

+0

解決策が正しいとは言えません。私が得たい主な結果は、私のクラスローダがメソッドで設定したファイルディレクトリからクラスをロードできることです。それ以外の場合は、親クラスローダが呼び出されます。 – pikachu

答えて

1
を、私は感謝していただきたいです

java.net.URLClassLoaderのフレームワークを使用することができます。あなた自身で書く必要はありません。ディレクトリやJARファイルからのクラスのロードをサポートしています。

「/」で終わるURLはすべて、ディレクトリを指すものとみなされます。 それ以外の場合、URLは必要に応じて開かれた のJARファイルを参照していると見なされます。

また、親クラスローダーもサポートしています。このクラスローダーが要件を満たしていない場合は、必要なものをより詳細に指定できます。いずれにしても、ソースを見て、それに基づいて独自のクラスローダークラスを派生させることができます。ここで

がURLClassLoaderのから名前でクラスをロードする方法をdemostrateすべきコードの短い作業抜粋されています、もしあれば、あなたはどのようなエラー(複数可)を取得している

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

+0

私はわかりませんが、あなたの例もNPEを返します。 – pikachu

+0

単体テストでテストしましたが、うまくいきました。あなたの質問を編集し、完全なスタックトレースを投稿してください。 – Strelok

関連する問題