Le rechargement de classes existantes avec les données existantes sont susceptibles de casser des choses.
Vous pouvez charger un nouveau code dans la nouvelle catégorie des chargeurs assez facilement:
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();
Classe chargeurs qui ne sont plus utilisés peuvent être nettoyés (à moins qu'il y est une fuite de mémoire, comme c'est souvent le cas avec l'aide de ThreadLocal, les pilotes JDBC, java.beans
, etc).
Si vous souhaitez conserver les données de l'objet, puis-je suggérer un mécanisme de persistance comme de la Sérialisation, ou ce que vous êtes habitué.
Bien sûr, le débogage de systèmes peuvent faire des choses plus, mais sont plus hacky et de moins en moins fiable.
Il est possible d'ajouter de nouvelles classes dans un chargeur de classe. Par exemple, à l'aide de URLClassLoader.addURL
. Toutefois, si une classe ne parvient pas à charger (en raison, par exemple, vous n'avez pas ajouté), alors il ne sera jamais à la charge de la classe loader instance.