Как загрузить файл банки во времени выполнения [дубликат]

72
задан Paul Richter 17 January 2014 в 15:28
поделиться

4 ответа

Перезагрузка существующих классов с существующими данными, вероятно, повредит вещи.

можно загрузить новый код в новые загрузчики класса относительно легко:

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. Однако, если класс не загрузится (потому что, скажем, Вы не добавили его), тогда это никогда не будет загружаться в том экземпляре загрузчика класса.

79
ответ дан Chris Jester-Young 24 November 2019 в 12:41
поделиться

меня попросили создать систему Java, которая будет иметь способность загрузить новый код при выполнении

, Вы могли бы хотеть основывать свою систему на OSGi (или по крайней мере взять много в нем), который был сделан для точно этой ситуации.

Питание с classloaders является действительно хитрым бизнесом, главным образом из-за того, как видимость класса работает, и Вы не хотите сталкиваться с трудными к отладке проблемами позже. Например, Class.forName () , который широко используется во многих библиотеках, не работает слишком хорошо над фрагментированным пространством classloader.

8
ответ дан Rob Kielty 24 November 2019 в 12:41
поделиться

Это работает на меня:

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");
35
ответ дан Yannick Rot 24 November 2019 в 12:41
поделиться

Я погуглил немного и нашел этот код здесь :

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);   

кто-либо может совместно использовать мнения/комментарии/ответы относительно этого подхода?

3
ответ дан Amir Arad 24 November 2019 в 12:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: