2012-02-08 10 views
5

抽象クラスを使用して、独自の実装を記述できるアプリケーションがあります。これらの実装をディレクトリから.class-filesとしてロードします。私はそれらを正しくロードするためにクラスがに配置されているパッケージを指定する必要があります - あなたが見たようパッケージを指定せずにフォルダからクラスをロードする

File classDir = new File("https://stackoverflow.com/users/myproject/classes/"); 

URL[] url = { classDir.toURI().toURL() }; 
URLClassLoader urlLoader = new URLClassLoader(url); 

String filename; 
for (File file : classDir.listFiles()) { 
    filename = string.getFilenameWithoutExtension(file); 
    if (filename.equals(".") || filename.equals("..") || filename.startsWith(".")) 
     continue; 

AbstractClass instance = (AbstractClass)urlLoader 
    .loadClass("org.mypackage." + filename) 
    .getConstructor(ConfigUtil.class, DatabaseUtil.class, StringUtil.class) 
    .newInstance(config, database, string)); 

    instance.doSomething(); 
} 

:現在、私はこのソリューションを持っています。パッケージを省略すると、私は

java.lang.NoClassDefFoundError: 
    MyClass (wrong name: org/mypackage/MyClass) 

エラーが発生します。

今は建築POVから、他の人が設計したクラスをロードするときにMYパッケージにコンパイルする必要があることは非常にうまく設計されていないと思います。

私はあなたに質問します:ファイルシステムからクラスをロードする方法はありますか?

+1

パスの下にパッケージ構造をフォルダ構造として保持できますか?クラスをロードする前にパスからパッケージ名を作成しますか? –

+0

それは可能性があります...少なくとも2つのクラスが同じ名前を持っていれば、私は自分自身に悩まされる必要はありません。 :) –

+0

いくつかのコード例が私に教えてくれればそれを試してみてください! –

答えて

3

はい。インタフェースを実装する(または注釈を使用する)。

次に、特定のクラスを読み込むために、クラススキャンライブラリ(this oneのようなこれに関する多くの質問があります)を使用します。 「Javaクラススキャン」または「Javaプラグインメカニズム」を検索すると役立ちます。

また、Java Plugin Frameworkを使用していくつかの努力をしたくない場合もあります。それは私にはそれ以上維持されていることは明らかではありませんが、私は人々がまだそれを使用していることを知っています。

+0

私の場合、インターフェイスが正しく(意味的には)動作するとは思わない。 'AbstractClass'には、実装のオーバーライド(override、wtf?)のメソッドだけを使う、あらかじめ定義された多くの関数があります。インターフェイスでは許可されていません。 –

+0

@FlorianPeschka ...同じ違いがあります。 –

+0

私はあなたのコメントを理解していません。何の違い? –

関連する問題