人们使用类加载的是什么?

dop*_*ish 16 java classloader

因此,每本Java教科书都讨论了Java的灵活性,因为它可以在运行时加载类.只需拼凑一个字符串并将其交给它Class.forName(),然后抓住ClassNotFoundException并处理它.这个理论太多了.

您能举例说明您是如何使用Java类加载来实现一个本来不可能或不容易的功能的吗?请注意,我不是问"有什么伟大的事情可以做什么?" - 我正在寻找真实世界的例子,无论是开源应用程序还是 - 如果你能够在不提供太多细节的情况下描述它 - 一个专有的应用程序.

编辑:当然,VM会根据需要懒惰地加载类.只要我确信我所需要的所有课程都在那里,这就是幕后的事情.我该怎么处理ClassNotFoundException?假设我写了十页文本,并且PrinterDriver找不到该课程.

Gnu*_*rou 10

插件是第一个浮现在脑海中的东西.与C++之类的语言相比,Java类加载使其变得非常容易.

您可能不知道的一点是,任何Java虚拟机都在很大程度上依赖于内部的类加载.每当字节码解释器看到对方法的引用时,它就会检查方法所属的类是否已经加载,如果不加载,则Class.forName()在解析方法之前使用完全相同的机制加载它.这种机制非常强大,因为任何Java应用程序都真正充当一组可动态加载的可替换组件.如果VM写得很好,它可以通过自定义类加载器加载类,该加载器从网络中取代类而不是常规文件.

类加载时间取决于虚拟机实现,但大多数依赖于这种后期绑定机制,该机制在VM第一次遇到它时加载类.


Naw*_*Man 5

"PLUGIN",这就是大字.

基本上,您可以在编写和编译程序时加载一个您不知道何时或不存在的类.

例如,如果您希望程序进行拼写检查,则可以编写一个接口,SpellChecker然后从实现该SpellChecker接口的配置文件中加载一个类.之后,您可以编写任何SpellChecker并在配置文件中设置实际文件名.这样,您的程序不需要知道哪个类将执行拼写检查.

数据库驱动程序,Eclipse的插件,脚本语言,加密方法都是以这种方式完成的,因为原始编写者不知道(在某些情况下,不知道)将实际使用哪个类.

希望这可以帮助.


ewe*_*nli 5

应用服务器还严重依赖于ClassLoaders隔离不同的已部署模块.例如

  • 您可以在不同的路径下两次部署相同的Web应用程序
  • 两个应用程序可以依赖于同一个库的两个不同版本而不会发生冲突.

感谢类加载器的魔力......