2016-10-28 3 views
5

Können Sie mir sagen, was ist der Unterschied zwischen Thread.currentThread().getContextClassLoader() und TestServlet.class.getClassLoader() kennzeichnet es nicht als Duplikat und auch sowie geben Sie mir bitte Beispiel erklären, wenn diese verwendenUnterschied zwischen Thread.currentThread() und normalen classloader classloader

Java-Datei:

package com.jar.test; 

public class TestServlet { 
    public static void main(String args[]) {  
     ClassLoader cls = TestServlet.class.getClassLoader().loadClass(
       "com.jar.test.TestServlet"); 
     ClassLoader cls = Thread.currentThread().getContextClassLoader() 
       .loadClass("com.jar.test.TestServlet"); 
    } 
} 
+2

eigentlich ist es ein [duplizieren] (http://stackoverflow.com/questions/1771679/difference-between-threads-context-class-loader-and-normal-classloader/1772346) – nandsito

+0

"markieren Sie es nicht als doppelt "Wenn Sie wissen, dass dies ein Duplikat ist, dann teilen Sie Ihre Forschungsergebnisse mit (http://stackoverflow.com/help/how-to-ask). Verknüpfen Sie mit [duplizieren] (http://stackoverflow.com/help/duplicates) und erklären Sie, wie es sich von Ihrer Frage unterscheidet. Inzwischen habe ich dies als ein Duplikat gekennzeichnet ... (Btw, Befehle wie "nicht markieren ..." kann als unhöflich angesehen werden.) –

Antwort

4

Thread.currentThread().getContextClassLoader()

Gibt den cont ext ClassLoader für diese Thread. Der Kontext ClassLoader wird von der Ersteller des Threads zur Verwendung von Code in diesem Thread beim Laden Klassen und Ressourcen zur Verfügung gestellt. Wenn nicht festgelegt, ist der Standard der ClassLoader Kontext des übergeordneten Threads. Der Kontext ClassLoader von der ursprüngliche Thread ist in der Regel auf den Klassenlader eingestellt, die Anwendung zu laden.

Class#getClassLoader()

Gibt den Klassenlader für die Klasse. Einige Implementierungen können null verwenden, um den Bootstrap-Klassenlader darzustellen. Diese Methode gibt null in solchen Implementierungen zurück, wenn diese Klasse vom Klassenladeprogramm bootstrap geladen wurde.


In Kürze:

Thread.currentThread().getContextClassLoader() ist die ClassLoader des Kontextes des Fadens, die mit setContextClassLoader(ClassLoader cl) eingestellt wurde. Stellen Sie sich vor, Sie haben eine komplexe Java-Anwendung mit einer Hierarchie von ClassLoader (z. B. einem Anwendungsserver) und möchten, dass Ihr aktueller Thread Klassen oder Ressourcen von einer spezifischen ClassLoader in dieser Hierarchie lädt, indem Sie einfach den Kontext ClassLoader von der Thread zu diesem spezifischen ClassLoader.

Class#getClassLoader() ist einfach die ClassLoader, von der Ihre Instanz Class geladen wurde.

1

Thread.currentThread(). GetContextClassLoader()

Dies ist der aktuelle Thread Classloader und hängt nicht von der Klasse es

TestServlet.class.getClassLoader() aufrufen

Dies ist der Klassenlader, der die TestServlet-Klasse geladen hat.

bitte erklären, sowie bieten mir Beispiel, wenn diese verwenden

Lasst uns vorstellen, dass Sie haben Thread1 im Besitz von ClassLoader1 und Thread2 von ClassLoader2 gehört. Es ist möglich, dass Sie Ihre TestServlet-Klasse in Thread2 (von ClassLoader2) laden und es dann an Thread1 übergeben. Wenn TestServlet dann eine Klasse laden muss, die ClassLoader1 gehört, muss Thread.currentThread(). GetCotextClassLoader() verwendet werden, da der eigene ClassLoader ClassLoader2 und nicht ClassLoader1 ist.

+0

Vielen Dank, wenn möglich, bitte geben Sie mir einen Beispielcode, damit ich besser verstehen kann –