是否有其他方法可以使用 Class.forName() 加载类?

Luk*_*der 5 java osgi classloader

在我的库的代码中,我使用 JAXB 从 XML 文件加载类名,以便稍后使用Class.forName(). 一个虚构的例子来说明这一情况:

public void libraryMethod() throws Exception {
  List<String> classNames = loadClassNamesFromXML();

  for (String className : classNames) {
    Class.forName(className).newInstance().doThings();
  }
}
Run Code Online (Sandbox Code Playgroud)

现在,一些用户使用 OSGi 来配置他们的应用程序,他们使用与使用我的 XML 结构配置的类不同的类加载器来加载我的库。这意味着加载可能会失败,因为找不到该类。

有没有更可靠的方法来加载此类?或者还有其他方法来配置这些实例吗?我愿意接受导致此结果的建议:

public void libraryMethod() throws Exception {
  // Spring does things like this:
  List<SomeType> instances = loadInstancesFromXML();

  for (SomeType instance : instances) {
    instance.doThings();
  }
}
Run Code Online (Sandbox Code Playgroud)

一些限制:

  • 从库的角度来看,这些实例的生命周期并不重要。如果他们有(用户)状态,我的图书馆不会注意到。
  • 我想让这个库中的事情保持简单,所以我想避免在配置框架(例如 spring)上创建外部依赖项。因此,我只对可以使用标准 JDK 6+ 发行版实现的解决方案感兴趣。
  • 我真的很想保留我的简单 XML 配置文件(对 XML 结构稍作修改就可以了)。

Iva*_*rov 4

如果您希望您的库灵活并在 OSGi 和非 OSGi 环境中工作,您应该允许用户提供他们自己的类加载器,或者让他们告诉您的库他们有哪些类名。阅读尼尔·巴特利特博客文章.

原始链接返回 404。您可以在Wayback Machine 上访问该文章。