Перезагрузка существующих классов с существующими данными, вероятно, повредит вещи.
можно загрузить новый код в новые загрузчики класса относительно легко:
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
, и т.д.).
, Если Вы хотите сохранить данные объектов, тогда я предлагаю механизм персистентности, такой как Сериализация, или независимо от того, что Вы привыкли к.
, Конечно, системы отладки могут сделать более необычные вещи, но являются большим количеством hacky и менее надежный.
возможно добавить новые классы в загрузчик класса. Например, использование URLClassLoader.addURL
. Однако, если класс не загрузится (потому что, скажем, Вы не добавили его), тогда это никогда не будет загружаться в том экземпляре загрузчика класса.
меня попросили создать систему Java, которая будет иметь способность загрузить новый код при выполнении
, Вы могли бы хотеть основывать свою систему на OSGi (или по крайней мере взять много в нем), который был сделан для точно этой ситуации.
Питание с classloaders является действительно хитрым бизнесом, главным образом из-за того, как видимость класса работает, и Вы не хотите сталкиваться с трудными к отладке проблемами позже. Например, Class.forName () , который широко используется во многих библиотеках, не работает слишком хорошо над фрагментированным пространством classloader.
Это работает на меня:
File file = new File("c:\\myjar.jar");
URL url = file.toURL();
URL[] urls = new URL[]{url};
ClassLoader cl = new URLClassLoader(urls);
Class cls = cl.loadClass("com.mypackage.myclass");
Я погуглил немного и нашел этот код здесь :
File file = getJarFileToLoadFrom();
String lcStr = getNameOfClassToLoad();
URL jarfile = new URL("jar", "","file:" + file.getAbsolutePath()+"!/");
URLClassLoader cl = URLClassLoader.newInstance(new URL[] {jarfile });
Class loadedClass = cl.loadClass(lcStr);
кто-либо может совместно использовать мнения/комментарии/ответы относительно этого подхода?