一般来说,问题在于 Java 的安全模型实际上试图阻止已经加载的类被再次加载。
当然Java从一开始就支持动态类加载,难的是类重载。
认为正在运行的 Java 应用程序被注入带有恶意代码的新类是有害的(并且有充分的理由)。例如来自互联网的 java.lang.String 破解实现,它不是创建字符串,而是删除一些调用方法 length() 的随机文件。
因此,Java 的构想方式(因此我认为 .NET CLR,因为它在 JVM 中受到高度“启发”)是为了防止已经加载的类再次加载同一个 VM。
他们提供了一种机制来覆盖此“功能”。类加载器,但是类加载器的规则是,在尝试加载新类之前,它们应该向“父”类加载器请求许可,如果父类已经加载了该类,则忽略新类。
例如,我使用了从 LDAP 或 RDBMS 加载类的类加载器
当应用服务器成为 Java EE 的主流时,热部署成为 Java 世界的必需品(并且还需要像 spring 这样的微容器来避免这些负担)。
每次编译后重新启动整个应用服务器会让任何人发疯。
所以应用服务器提供商,提供这个“自定义”类加载器来帮助热部署,并使用配置文件,这种行为,应该在生产中设置时被禁用。但权衡是您必须在开发中使用大量内存。因此,执行此操作的好方法是每 3 到 4 次部署重新启动一次。
其他从一开始就设计为加载其类的语言不会发生这种情况。
例如,在 Ruby 中,您甚至可以将方法添加到正在运行的类中,在运行时覆盖方法,甚至可以将单个方法添加到唯一的特定对象。
在这些环境中的权衡当然是内存和速度。
我希望这会有所帮助。
编辑
我前段时间发现这个产品承诺重新加载尽可能简单。当我第一次写这个答案时,我不记得链接了,我记得。
是JavaRebel from ZeroTurnaround