我有一个由类实现的接口,用于执行文件处理,比如搜索或其他操作。
public interface FileProcessorInterface {
public void processFile(String fileName);
}
然后我针对每种文件类型都有不同的实现:
public class TxtProcessor implements FileProcessorInterface {
@Override public void processFile(String fileName) { //do the work }
}
因此我拥有处理器的Utilizer,它有一个方法可以注册每个类,类似于以下内容:
class Utilizer {
Map <String, Class> registered = new HashMap<>();
public void registerClass(String fileExt, Class clazz) {
registered.put(fileExt, clazz);
}
public void processFile(String fileName) {
//1) get the registered class from registered map (omitted because easy and not relevant)
//2) create an instance of the class using reflection (omitted because easy and not relevant)
FileProcessorInterface p = ....
p.processFile(fileName);
}
到目前为止还好。
现在,我提供了很多我的接口实现。
我很想为每个实现类提供一个静态初始化程序,在Utilizer中注册自己,在之前的TxtProcessor中它是这样的:
class TxtProcessor implements FileProcessorInterface {
//previous code
static {
Utilizer.registerClass("txt", TxtProcessor.class);
}
}
问题在于这个静态方法永远不会被调用,因为在应用程序的“静态可达”代码中没有引用到我的TxtProcessor类,因为它是通过反射实例化的。因此,JVM不会调用静态初始化程序。假设我有两个部分:通用代码是Utilizer,实现是另一部分;它必须被视为动态提供的东西,因此Utilizer部分并不知道它。事实上,想法正是每个类都会注册自己,使Utilizer保持不变。
对于我来说,很难构思出一种不需要在Utilizer端放置某些形式的实现“知识”(并且保持简单)的解决方案,正是由于静态初始化程序未被调用的问题。如何克服这个问题?
“path.to.all.processors.pkg”
)? 代码可以添加到任何项目中,我们不能让开发人员需要开始编辑代码或配置文件。 我们需要能够找到所有相关的类。 - Ian Boyd