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

标签 java reflection classloader

继续这个线程: Failed to connect hypersonic(HSQLDB) DB on Apache 7.0

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

有没有办法从某个 jar 加载类?

最佳答案

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

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

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://....”连接字符串提供连接。

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

关于java - Class.forName() - 还有其他方法使用它吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32106052/

相关文章:

c# - .NET 反射 : Unable to retrieve Dynamic Properties

java - 记录实例的任何方法调用

spring - 使用特定的类加载器加载 Spring 上下文

java - Beanshell 不会加载我动态添加的 JDBC 驱动程序类?

Java - mysql连接池的单例模式 - 连接太多

java - Selenium (chromedriver) 中的 Xpath 不会匹配第二个标签

java - JPA:映射为@ManyToMany @JoinTable 的关系的隐式级联?

java - 如何将一段代码延迟到返回调用之后?

c# - 在 C# 中使用反射自注册工厂

java - 添加Maven依赖并设置为$CATALINA_HOME/shared/lib