序言
- PF4J版本:2.6.0
由于PF4J是非常轻量级的框架,这代表着该框架内包含的接口、抽象类、工具类等的数量可能很容易令人接受。所以在学习过程中,我把所有类和接口等之间的关系通过图形罗列了出来。之后再对每一部分做总结。
ExtensionFinder
@Override
protected ExtensionFinder createExtensionFinder() {
DefaultExtensionFinder extensionFinder = new DefaultExtensionFinder(this);
addPluginStateListener(extensionFinder);
return extensionFinder;
}
PF4J通过PluginManager持有一个DefaultExtensionFinder对象,
public DefaultExtensionFinder(PluginManager pluginManager) {
this.pluginManager = pluginManager;
add(new LegacyExtensionFinder(pluginManager));
// add(new ServiceProviderExtensionFinder(pluginManager));
}
DefaultExtensionFinder的构造器接收PluginManager作为参数,DefaultExtensionFinder内部持有一个用来存放ExtensionFinder的List容器finders,该版本中finders存放的是LegacyExtensionFinder。
@Override
public Map<String, Set<String>> readPluginsStorages() {
log.debug("Reading extensions storages from plugins");
Map<String, Set<String>> result = new LinkedHashMap<>();
List<PluginWrapper> plugins = pluginManager.getPlugins();
for (PluginWrapper plugin : plugins) {
String pluginId = plugin.getDescriptor().getPluginId();
log.debug("Reading extensions storage from plugin '{}'", pluginId);
Set<String> bucket = new HashSet<>();
try {
Enumeration<URL> urls = ((PluginClassLoader) plugin.getPluginClassLoader()).findResources(getExtensionsResource());
if (urls.hasMoreElements()) {
collectExtensions(urls, bucket);
} else {
log.debug("Cannot find '{}'", getExtensionsResource());
}
debugExtensions(bucket);
result.put(pluginId, bucket);
} catch (IOException e) {
log.error(e.getMessage(), e);
}
}
return result;
}
LegacyExtensionFinder.readPluginsStorages()方法会从META-INF/extensions.idx读取到插件内的全限定名类文件。