From 71bcf118746bc05548777d0a3cce3dc69a8cd8d8 Mon Sep 17 00:00:00 2001 From: Armin Schrenk Date: Fri, 20 Mar 2026 18:50:21 +0100 Subject: [PATCH] Cache classloader and lazily initialize it --- .../integrations/common/ClassLoaderFactory.java | 2 +- .../integrations/common/IntegrationsLoader.java | 12 ++++++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/cryptomator/integrations/common/ClassLoaderFactory.java b/src/main/java/org/cryptomator/integrations/common/ClassLoaderFactory.java index 922bcb1..50b29c2 100644 --- a/src/main/java/org/cryptomator/integrations/common/ClassLoaderFactory.java +++ b/src/main/java/org/cryptomator/integrations/common/ClassLoaderFactory.java @@ -23,7 +23,7 @@ class ClassLoaderFactory { /** * Attempts to find {@code .jar} files in the path specified in {@value #PLUGIN_DIR_KEY} system property. - * A new class loader instance is returned that loads classes from the given classes. + * A new class loader instance is returned that loads classes from the given directory. * * @return A new URLClassLoader that is aware of all {@code .jar} files in the plugin dir */ diff --git a/src/main/java/org/cryptomator/integrations/common/IntegrationsLoader.java b/src/main/java/org/cryptomator/integrations/common/IntegrationsLoader.java index c0f5116..92f5a9d 100644 --- a/src/main/java/org/cryptomator/integrations/common/IntegrationsLoader.java +++ b/src/main/java/org/cryptomator/integrations/common/IntegrationsLoader.java @@ -23,6 +23,14 @@ public class IntegrationsLoader { private IntegrationsLoader() { } + private static class PluginClassLoaderHolder { + private static final ClassLoader CLASS_LOADER = ClassLoaderFactory.forPluginDir(); + } + + private static ClassLoader getClassLoader() { + return PluginClassLoaderHolder.CLASS_LOADER; + } + /** * Loads the best suited service provider, i.e. the one with the highest priority that is supported. *

@@ -44,7 +52,7 @@ public static Optional load(Class clazz) { * @param Type of the service */ public static Optional loadSpecific(Class clazz, String implementationClassName) { - return ServiceLoader.load(clazz, ClassLoaderFactory.forPluginDir()).stream() + return ServiceLoader.load(clazz, getClassLoader()).stream() .filter(provider -> provider.type().getName().equals(implementationClassName)) .map(ServiceLoader.Provider::get) .findAny(); @@ -61,7 +69,7 @@ public static Optional loadSpecific(Class clazz, String implementation * @return An ordered stream of all suited service providers */ public static Stream loadAll(Class clazz) { - return loadAll(ServiceLoader.load(clazz, ClassLoaderFactory.forPluginDir()), clazz); + return loadAll(ServiceLoader.load(clazz, getClassLoader()), clazz); } /**