Class.forName() - 还有其他方法可以使用它吗?

时间:2015-08-19 21:36:09

标签: java reflection classloader

连续这个帖子: Failed to connect hypersonic(HSQLDB) DB on Apache 7.0

我需要知道是否还有其他一些新方法可以使用Class.forName()功能。

有没有办法从某个罐子加载一个类?

1 个答案:

答案 0 :(得分:0)

对于JDBC和其他服务(从应用程序的服务意义上讲,而不是OSGI服务),有ServiceLoader将根据类路径加载类,并且如果类路径上的任何jar文件提供提供“抽象”服务的“实现”。

较旧的方式有一个DriverManager,它基本上是一个可能的服务集合。这是您的示例中显示的模式,其中创建类的实例通常会强制运行“静态初始化程序”块。该块通常看起来像。

public class MyService implements Service {
  static {
     ServiceRegistry.register(new MyService());
  } 
}

或特别是JDBC

public class MyDriver implements Driver{
  static {
     DriverManager.registerDriver(new MyDriver());
  } 
}

在JDBC中,驱动程序管理器然后浏览已注册服务的列表,询问每个服务器是否为“jdbc:hsqldb:hsql:// ....”连接字符串提供连接。

如果您不能依赖静态初始化程序块,并且您特别处理JDBC,则可以(假设您可以以某种方式加载类)调用方法在DriverManager中注册实例,使用registerDriver(.. );但是,你可以很容易地看到所涉及的模式。