2016-09-09 37 views
0

実行時にJavaクラスを動的にロードする必要があります。この目的のために私はhttps://github.com/trung/InMemoryJavaCompilerを使用しています。カスタムクラスローダーを使用する場合のjava.lang.ClassCastException

ロードする必要があるクラスは、すでにアプリケーションの一部であるインターフェイスを実装しています(したがって、このインターフェイスはsystem-classloaderによって読み込まれます)。クラスがロードされた後、私はそれをインターフェイスにキャストします。

更新日:申し訳ありませんが、私はドッカーについて間違っていました。それはもちろんドッカーとは関係ありませんが、私はコマンドラインでアプリケーションを起動しているという事実を持っています:java -jar ...。アプリケーションがintellijから起動されたときに動作します。私がキャストしようとすると、java.lang.ClassCastExceptionがコマンドラインから起動されます。

実インターフェースのクラスローダーは、org.springframework.boot.loader.LaunchedURLClass Loader @ 2a84aee7で、動的にロードされるインターフェースのクラスローダーは[email protected]です。問題の特定にご協力いただきありがとうございます。

同じクラスローダを使用するにはどうすればよいですか?

インターフェイスのクラスローダーのカスタムクラスローダの子を常に作成することをお勧めしますか?new DynamicClassLoader(MyInterface.class.getClassLoader())

+4

'generatedInstance.getClass()。getInterfaces()'にYourInterfaceが含まれ、これらのインターフェイスのクラスローダーが 'YourInterface.class.getClassLoader()'に等しいかどうかを確認します。 – apangin

+1

@apanginが正しいです。クラスとインタフェースが最初に同じクラスローダによってロードされているかどうかを確認してください。 :) – neohope

+0

DockerはJVMのクラスの読み込み方法を変更するべきではありません。 –

答えて

1

はい、DynamicClassLoaderは、MyInterfaceをロードするClassLoaderに委任する必要があります。

new DynamicClassLoader(MyInterface.class.getClassLoader())は問題ありません。

関連する問題