code: public void refreshExtensions() throws ExtensionRefreshException {
          ExtensionList<ExtensionFinder> finders = getExtensionList(ExtensionFinder.class);
          for (ExtensionFinder ef : finders) {
              if (!ef.isRefreshable())
                  throw new ExtensionRefreshException(ef+" doesn't support refresh");
          }
  
          List<ExtensionComponentSet> fragments = Lists.newArrayList();
          for (ExtensionFinder ef : finders) {
              fragments.add(ef.refresh());
          }
          ExtensionComponentSet delta = ExtensionComponentSet.union(fragments).filtered();
  
          // if we find a new ExtensionFinder, we need it to list up all the extension points as well
          List<ExtensionComponent<ExtensionFinder>> newFinders = Lists.newArrayList(delta.find(ExtensionFinder.class));
          while (!newFinders.isEmpty()) {
              ExtensionFinder f = newFinders.remove(newFinders.size()-1).getInstance();
  
              ExtensionComponentSet ecs = ExtensionComponentSet.allOf(f).filtered();
              newFinders.addAll(ecs.find(ExtensionFinder.class));
              delta = ExtensionComponentSet.union(delta, ecs);
          }
  
          for (ExtensionList el : extensionLists.values()) {
              el.refresh(delta);
          }
          for (ExtensionList el : descriptorLists.values()) {
              el.refresh(delta);
          }
  
          // TODO: we need some generalization here so that extension points can be notified when a refresh happens?
          for (ExtensionComponent<RootAction> ea : delta.find(RootAction.class)) {
              Action a = ea.getInstance();
              if (!actions.contains(a)) actions.add(a);
          }
      }
docs: Refresh {@link ExtensionList}s by adding all the newly discovered extensions.
  
  Exposed only for {@link PluginManager#dynamicLoad(File)}.