在我的库的代码中,我使用JAXB从XML文件加载类名,以便稍后使用Class.forName()
对其进行实例化。虚构的例子来说明情况:是否有加载类Class.forName()的类的替代方法?
public void libraryMethod() throws Exception {
List<String> classNames = loadClassNamesFromXML();
for (String className : classNames) {
Class.forName(className).newInstance().doThings();
}
}
现在,有些用户使用OSGi的配置他们的应用程序,以及它们的加载我的图书馆有不同的类加载器比他们班使用配置我的XML结构。这意味着加载可能会失败,因为无法找到该类。
有没有更可靠的方法来加载这样的类?或者还有其他方式来配置这些实例吗?我打开导致此建议:
public void libraryMethod() throws Exception {
// Spring does things like this:
List<SomeType> instances = loadInstancesFromXML();
for (SomeType instance : instances) {
instance.doThings();
}
}
一些制约因素:
- 从图书馆的角度看,这些实例的生命周期是不重要的。如果他们有(用户)状态,我的图书馆不会注意到。
- 我想在这个库中保持简单的事情,所以我想避免在像spring这样的配置框架上创建外部依赖。所以我只对标准JDK 6+发行版可以实现的解决方案感兴趣。
- 我真的想保留我简单的XML配置文件(对XML结构的轻微改动都可以)。
您已经在一个特殊的解决方案中相当深入,而不会显示您尝试解决的实际问题。你能解释一下你的xml配置是干什么的吗?为什么你必须从其他包中加载类而不导入包? – 2012-07-14 18:39:17
@ChristianSchneider:我写了一个库([jOOQ](http://www.jooq.org))。我不能导入任意的用户包,但我希望库用户能够将'SomeType'的实现注入到我的库中。有了Spring,注入这样的实现将非常容易,但这意味着我的库对spring本身会产生“沉重的”依赖。 – 2012-07-14 19:27:58
做一些研究之前提出问题,去反思(懒惰initilaztion) – Pawan 2012-09-28 06:20:10