既存のデータで既存のクラスをリロードすると、問題が発生する可能性があります。
新しいコードを新しいクラス ローダーに比較的簡単にロードできます。
ClassLoader loader = URLClassLoader.newInstance(
new URL[] { yourURL },
getClass().getClassLoader()
);
Class<?> clazz = Class.forName("mypackage.MyClass", true, loader);
Class<? extends Runnable> runClass = clazz.asSubclass(Runnable.class);
// Avoid Class.newInstance, for it is evil.
Constructor<? extends Runnable> ctor = runClass.getConstructor();
Runnable doRun = ctor.newInstance();
doRun.run();
使用されなくなったクラスローダーは、ガベージコレクションできます (ThreadLocal、JDBC ドライバーjava.beans
などを使用する場合によくあるように、メモリリークがない限り)。
オブジェクトデータを保持したい場合は、シリアライゼーションなどの永続化メカニズム、または慣れ親しんだものをお勧めします。
もちろん、デバッグシステムはより手の込んだことを行うことができますが、よりハックで信頼性が低くなります。
クラスローダーに新しいクラスを追加することができます。たとえば、 を使用しURLClassLoader.addURL
ます。ただし、クラスのロードに失敗した場合 (たとえば、クラスを追加していないため)、そのクラス ローダー インスタンスにロードされることはありません。