{"id":82,"date":"2023-09-08T22:50:00","date_gmt":"2023-09-08T21:50:00","guid":{"rendered":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=82"},"modified":"2024-01-08T09:15:50","modified_gmt":"2024-01-08T08:15:50","slug":"eine-kleine-einfuehrung-in-java-classloader","status":"publish","type":"post","link":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=82","title":{"rendered":"Eine kleine Einf\u00fchrung in Java-Classloader"},"content":{"rendered":"\n<p>Die Java Virtual Machine (JVM) ist f\u00fcr ihre Portabilit\u00e4t und Dynamik bekannt, und der Classloader spielt eine zentrale Rolle bei der Verwaltung der Klassen w\u00e4hrend der Laufzeit. Dieser Artikel bietet eine tiefgehende Analyse der Klassenlademechanismen in Java, von den verschiedenen Arten von Classloadern bis hin zur Nutzung eigener Classloader f\u00fcr die Isolierung von Subsystemen innerhalb einer JVM.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">1. Klassenlademechanismus in Java<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">1.1 Dynamisches Laden von Klassen<\/h3>\n\n\n\n<p>Java verwendet ein dynamisches Klassenladesystem, das die Flexibilit\u00e4t bietet, Klassen zur Laufzeit zu laden. Im Gegensatz zum statischen Laden w\u00e4hrend des Kompilierens erm\u00f6glicht dies die dynamische Erweiterung von Anwendungen und das Hinzuf\u00fcgen neuer Klassen zur Laufzeit.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1.2 Die Rolle des Classloaders<\/h3>\n\n\n\n<p>Der Classloader ist daf\u00fcr verantwortlich, Klassen und Ressourcen in die JVM zu laden. Er durchsucht dabei verschiedene Quellen, um die ben\u00f6tigten Klassen zu finden und sie im Speicher der JVM verf\u00fcgbar zu machen. Es gibt drei Haupttypen von Classloadern: Bootstrap-Classloader, Extension-Classloader und System-Classloader.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">2. Typen von Classloadern<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">2.1 Bootstrap-Classloader<\/h3>\n\n\n\n<p>Der Bootstrap-Classloader ist der prim\u00e4re Classloader und f\u00fcr das Laden der grundlegenden Java-Klassen verantwortlich. Diese Klassen sind Teil des Java-Laufzeitsystems und befinden sich normalerweise in der <code>rt.jar<\/code>-Datei. Der Bootstrap-Classloader ist in nativem Code implementiert und bildet den Ausgangspunkt der Classloader-Hierarchie.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-comment\">\/\/ Beispielcode f\u00fcr den Bootstrap-Classloader<\/span>\nClassLoader bootstrapLoader = <span class=\"hljs-built_in\">String<\/span>.class.getClassLoader();\nSystem.out.println(<span class=\"hljs-string\">\"Bootstrap Classloader: \"<\/span> + bootstrapLoader);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">2.2 Extension-Classloader<\/h3>\n\n\n\n<p>Der Extension-Classloader ist f\u00fcr das Laden von Erweiterungsklassen verantwortlich. Diese Klassen befinden sich im <code>lib\/ext<\/code>-Verzeichnis des JRE. Der Extension-Classloader erweitert den Funktionsumfang des Bootstrap-Classloaders und bildet die zweite Stufe der Hierarchie.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-comment\">\/\/ Beispielcode f\u00fcr den Extension-Classloader<\/span>\nClassLoader extensionLoader = javax.swing.JButton.class.getClassLoader();\nSystem.out.println(<span class=\"hljs-string\">\"Extension Classloader: \"<\/span> + extensionLoader);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">2.3 System-Classloader<\/h3>\n\n\n\n<p>Auch als Application-Classloader bekannt, ist der System-Classloader f\u00fcr das Laden von Anwendungs- bzw. Benutzerklassen verantwortlich. Er durchsucht den sogenannten &#8222;Classpath&#8220;, der eine Liste von Verzeichnissen und JAR-Dateien ist, in denen sich die Anwendungs- oder Benutzerklassen befinden.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-comment\">\/\/ Beispielcode f\u00fcr den System-Classloader<\/span>\nClassLoader systemLoader = <span class=\"hljs-keyword\">this<\/span>.getClass().getClassLoader();\nSystem.out.println(<span class=\"hljs-string\">\"System Classloader: \"<\/span> + systemLoader);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">3. Classloader-Hierarchien<\/h2>\n\n\n\n<p>In Java existiert eine strikte Hierarchie von Classloadern, die beim Laden von Klassen befolgt wird. Diese Hierarchie gew\u00e4hrleistet, dass Klassen nicht mehrmals geladen werden und dass Abh\u00e4ngigkeiten korrekt aufgel\u00f6st werden. Die Hierarchie besteht aus dem Bootstrap-Classloader, dem Extension-Classloader und dem System-Classloader, wobei letzterer an der Spitze steht.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">4. Eigene Classloader nutzen<\/h2>\n\n\n\n<p>Entwickler haben die M\u00f6glichkeit, eigene Classloader zu erstellen, um spezifische Anforderungen zu erf\u00fcllen. Dies kann das Laden von Klassen aus nicht standardm\u00e4\u00dfigen Quellen oder die Isolierung von Subsystemen innerhalb einer Anwendung umfassen.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">4.1 Beispiel f\u00fcr einen einfachen Classloader<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">public <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">CustomClassLoader<\/span> <span class=\"hljs-keyword\">extends<\/span> <span class=\"hljs-title\">ClassLoader<\/span> <\/span>{\n\n    @Override\n    public Class&lt;?&gt; loadClass(<span class=\"hljs-built_in\">String<\/span> name) throws ClassNotFoundException {\n        <span class=\"hljs-keyword\">if<\/span> (name.startsWith(<span class=\"hljs-string\">\"com.example\"<\/span>)) {\n            <span class=\"hljs-keyword\">return<\/span> loadClassForCustomModule(name);\n        }\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">super<\/span>.loadClass(name);\n    }\n\n    private Class&lt;?&gt; loadClassForCustomModule(<span class=\"hljs-built_in\">String<\/span> name) throws ClassNotFoundException {\n        <span class=\"hljs-comment\">\/\/ Implementiere benutzerdefiniertes Laden f\u00fcr das spezifische Modul<\/span>\n        <span class=\"hljs-comment\">\/\/ ...<\/span>\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">4.2 Anwendung eines eigenen Classloaders<\/h3>\n\n\n\n<p>Die Verwendung eines eigenen Classloaders bietet Entwicklern die M\u00f6glichkeit, unterschiedliche Versionen derselben Klasse in verschiedenen Teilen der Anwendung zu verwenden. Dies ist besonders n\u00fctzlich, wenn Module oder Subsysteme voneinander isoliert werden m\u00fcssen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">5. Wichtige Methoden des Standard-Classloaders<\/h2>\n\n\n\n<p>Die Standard-Classloader in Java bietet verschiedene Methoden zum Laden von Klassen und Ressourcen. Hier sind einige der wichtigsten Methoden:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">5.1 loadClass<\/h3>\n\n\n\n<p>Die <code>loadClass<\/code>-Methode wird verwendet, um eine Klasse zu laden. Sie versucht, die Klasse zu finden und zu laden, falls sie noch nicht geladen wurde. Wenn die Klasse nicht gefunden werden kann, wird die Methode eine <code>ClassNotFoundException<\/code> ausl\u00f6sen.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">5.2 defineClass<\/h3>\n\n\n\n<p>Die <code>defineClass<\/code>-Methode wandelt ein Byte-Array in eine Instanz der Klasse <code>Class<\/code> um. Sie wird h\u00e4ufig von benutzerdefinierten Classloadern \u00fcberschrieben, um das Laden von Klassen aus nicht standardm\u00e4\u00dfigen Quellen zu erm\u00f6glichen.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">5.3 findClass<\/h3>\n\n\n\n<p>Die <code>findClass<\/code>-Methode wird von Classloadern \u00fcberschrieben, um eine Klasse zu finden und zu laden. Diese Methode wird normalerweise dann verwendet, wenn die Klasse nicht in den Standardverzeichnissen gefunden wird.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">5.4 getResource<\/h3>\n\n\n\n<p>Die <code>getResource<\/code>-Methode wird verwendet, um Ressourcen wie Konfigurationsdateien oder Bilder zu laden. Sie sucht nach der Ressource im Classpath und gibt eine URL zur\u00fcck, die auf die Ressource zeigt.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-comment\">\/\/ Beispielcode f\u00fcr getResource<\/span>\nClassLoader classLoader = getClass().getClassLoader();\nURL resource = classLoader.getResource(<span class=\"hljs-string\">\"config.properties\"<\/span>);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Fazit<\/h2>\n\n\n\n<p>Der Classloader ist ein entscheidender Bestandteil der Java-Laufzeitumgebung und erm\u00f6glicht die Flexibilit\u00e4t und Dynamik, f\u00fcr die Java bekannt ist. Durch das Verst\u00e4ndnis der verschiedenen Classloader-Typen, der Hierarchien und der Nutzung eigener Classloader k\u00f6nnen Entwickler hochmodulare und flexible Anwendungen erstellen. Die hier behandelten Konzepte bieten eine solide Grundlage f\u00fcr die effiziente Verwaltung von Klassen und Ressourcen in der JVM. Ein tieferes Wissen \u00fcber die Methoden des Standard-Classloaders erm\u00f6glicht es Entwicklern, pr\u00e4zise Kontrolle \u00fcber den Ladevorgang zu haben und gezielte Anpassungen vorzunehmen.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Die Java Virtual Machine (JVM) ist f\u00fcr ihre Portabilit\u00e4t und Dynamik bekannt, und der Classloader spielt eine zentrale Rolle bei der Verwaltung der Klassen w\u00e4hrend der Laufzeit. Dieser Artikel bietet eine tiefgehende Analyse der Klassenlademechanismen in Java, von den verschiedenen Arten von Classloadern bis hin zur Nutzung eigener Classloader f\u00fcr die Isolierung von Subsystemen innerhalb [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[],"class_list":["post-82","post","type-post","status-publish","format-standard","hentry","category-plain_java"],"_links":{"self":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/82","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=82"}],"version-history":[{"count":2,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/82\/revisions"}],"predecessor-version":[{"id":84,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/82\/revisions\/84"}],"wp:attachment":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=82"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=82"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=82"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}