In Java können verschiedene Ressourcen mithilfe einer ähnlichen API, aber mit unterschiedlichen URL-Protokollen geladen werden. Dies ermöglicht die Entkopplung des Ressourcenladevorgangs von der Anwendung und vereinfacht die Ressourcenkonfiguration.
Können Sie ein Protokoll verwenden, um Ressourcen mithilfe des aktuellen Klassenladers abzurufen, ähnlich dem Jar-Protokoll, jedoch ohne Angabe der Ursprungsdatei oder? Ordner?
Dies kann erreicht werden, indem ein benutzerdefinierter URLStreamHandler implementiert und beim registriert wird JVM.
import java.io.IOException; import java.net.URL; import java.net.URLConnection; import java.net.URLStreamHandler; import java.net.URLStreamHandlerFactory; import java.util.HashMap; import java.util.Map; public class ClasspathHandler extends URLStreamHandler { private final ClassLoader classLoader; public ClasspathHandler(ClassLoader classLoader) { this.classLoader = classLoader; } @Override protected URLConnection openConnection(URL u) throws IOException { // Locate the resource using the classloader URL resourceUrl = classLoader.getResource(u.getPath()); // Open the connection to the resource return resourceUrl.openConnection(); } }
Verwendung: Der benutzerdefinierte Handler kann mit einer URL zum Laden von Ressourcen verwendet werden aus dem Klassenpfad:
new URL("classpath:org/my/package/resource.extension").openConnection();
Um den Handler global zugänglich zu machen, registrieren Sie ihn bei der JVM mit einer URLStreamHandlerFactory:
import java.net.URL; import java.net.URLStreamHandler; import java.net.URLStreamHandlerFactory; import java.util.HashMap; import java.util.Map; public class ClasspathHandlerFactory implements URLStreamHandlerFactory { private final Map<String, URLStreamHandler> protocolHandlers; public ClasspathHandlerFactory() { protocolHandlers = new HashMap<String, URLStreamHandler>(); addHandler("classpath", new ClasspathHandler(ClassLoader.getSystemClassLoader())); } public void addHandler(String protocol, URLStreamHandler handler) { protocolHandlers.put(protocol, handler); } public URLStreamHandler createURLStreamHandler(String protocol) { return protocolHandlers.get(protocol); } }
Rufen Sie URL.setURLStreamHandlerFactory() mit der konfigurierten Factory auf, um sich zu registrieren it.
Die bereitgestellte Implementierung wird als öffentliche Domain freigegeben. Der Autor empfiehlt, dass Änderungen geteilt und öffentlich zugänglich gemacht werden.
Während dieser Ansatz Flexibilität bietet, ist es wichtig, potenzielle Probleme zu berücksichtigen, wie z. B. die Möglichkeit mehrerer JVM-Handler-Factory-Registrierungen und Tomcats Verwendung eines JNDI-Handlers. Daher wird empfohlen, in der gewünschten Umgebung zu testen.
Das obige ist der detaillierte Inhalt vonWie kann ich mithilfe eines benutzerdefinierten URL-Protokolls Ressourcen aus dem Java-Klassenpfad laden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!