実行時に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())
?
'generatedInstance.getClass()。getInterfaces()'にYourInterfaceが含まれ、これらのインターフェイスのクラスローダーが 'YourInterface.class.getClassLoader()'に等しいかどうかを確認します。 – apangin
@apanginが正しいです。クラスとインタフェースが最初に同じクラスローダによってロードされているかどうかを確認してください。 :) – neohope
DockerはJVMのクラスの読み込み方法を変更するべきではありません。 –