静态和动态类加载?

时间:2010-06-27 03:30:49

标签: java oop

为什么我需要加载类定义,如:

的Class.forName( “类名”);

这有什么需要和优点。通常用于在JDBC中加载驱动程序类。

3 个答案:

答案 0 :(得分:10)

  

这有什么需要和优点。通常用于在JDBC中加载驱动程序类。

它允许您构建应用程序,以便不将关键外部依赖项编译到应用程序源代码中。

例如,在JDBC的情况下,它允许您在不改变源代码的情况下在不同的驱动程序实现和(理论上)不同的数据库供应商之间切换。

另一个用例是当某个供应商开发一个具有扩展点的应用程序的通用形式,允许客户“插入”他们自己的自定义类。自定义类通常使用Class.forName(...)加载。

第三个用例是应用程序框架和容器,它们通常使用Class.forName(...)来动态加载特定于应用程序的bean,servlet等的类。

第四个用例是应用程序(或更可能是应用程序库)在典型的应用程序运行中具有未使用的模块。通过在内部使用Class.forName(...),应用程序或库可以避免加载和初始化大量不需要的类的CPU和内存开销。 (Sun Swing库显然是为了减少应用程序启动时间,我确信还有其他示例。)

但是,如果您不需要能够执行此类操作,则静态依赖项更容易实现。

<强>后续

  

但是在这里,虽然编译自己的“ClassName”参数是已知的。所以关键外部依赖被编译成应用程序源代码?

不。显然,这违背了目的。应用程序(或框架)通常确定要从某个配置文件动态加载的类的名称。

答案 1 :(得分:1)

你没有,真的。 ClassName.class也可以正常运作。无论如何,以这种方式获取类定义通常是将SPI实现注入APIs的方式。

答案 2 :(得分:0)

使用 Class.forName(string className)的最简单原因是

  • 在JDBC 中,该语句用于加载和使用DriverManager注册DriverClass 。另一种方法是使用registerDriver(Driver obj)方法,该方法接收驱动程序类的对象。使用上述语句有助于我们避免直接处理驱动程序对象。
  • 大多数应用程序使用属性文件来定义JDBC连接和驱动程序属性。这种类型的动态加载有助于我们使应用程序更具可移植性,因为驱动程序可以配置而无需更改来源