Résumez le chargeur de classe Java.
boostrap class loader
jre / lib / rt.jar
ou` jre / lib / ʻunder .jar.getClassLoader ()
pour la classe chargée par le chargeur de classe bootstrap sera null
Example.java
public class Example
{
public static void main(String[] args)
{
System.out.println(String.class.getClassLoader());
}
}
$ javac Example.java && java Example
null
extension class loader
jre / lib / ext
getClassLoader ()
pour la classe chargée par le chargeur de classe d'extension sera sun.misc.Launcher $ ExtClassLoader
.getClassLoader (). GetParent ()
sera null
, c'est-à-dire qu'il n'y a pas de parent.Example.java
import sun.net.spi.nameservice.dns.DNSNameService;
public class Example
{
public static void main(String[] args)
{
ClassLoader extLoader = DNSNameService.class.getClassLoader();
System.out.println(extLoader);
System.out.println(extLoader.getParent());
}
}
$ javac Example.java && java Example
sun.misc.Launcher$ExtClassLoader@75b84c92
null
user class loader
getClassLoader ()
pour la classe chargée par le chargeur de classe utilisateur sera sun.misc.Launcher $ AppClassLoader
.
--getClassLoader (). getParent ()
révèle que sun.misc.Launcher $ ExtClassLoader
est le parentexample/A.java
package example;
public class A
{
}
Example.java
import example.A;
public class Example
{
public static void main(String[] args)
{
ClassLoader appLoader = Example.class.getClassLoader();
System.out.println(appLoader);
System.out.println(appLoader.getParent());
System.out.println(appLoader.getParent().getParent());
System.out.println();
appLoader = A.class.getClassLoader();
System.out.println(appLoader);
System.out.println(appLoader.getParent());
System.out.println(appLoader.getParent().getParent());
}
}
$ javac example/A.java && jar cf example/A.jar example/A.class
$ javac Example.java && java -classpath example/A.jar:./ Example
sun.misc.Launcher$AppClassLoader@2a139a55
sun.misc.Launcher$ExtClassLoader@75b84c92
null
sun.misc.Launcher$AppClassLoader@2a139a55
sun.misc.Launcher$ExtClassLoader@75b84c92
null
Recommended Posts