Javaのclass loaderについてまとめる。
boostrap class loader
- bootstrap class loaderはbootstrap classを読み込む
- bootstrap classは
jre/lib/rt.jar
やjre/lib/
以下の.jarに存在するクラスのことである- Macだと
/Library/Java/JavaVirtualMachines/jdk1.x.x_xxx.jdk/Contents/Home/jre/lib/rt.jar
など
- Macだと
- JVMに付属しているclass loaderであり、JVM起動時にクラスを読み込むのに使用される
- bootstrap class loaderによって読み込まれたクラスの
getClassLoader()
の返り値はnull
になる
- bootstrap classは
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
- extension class loaderは
jre/lib/ext
以下の.jarを読み込む- extension class loaderによって読み込まれたクラスの
getClassLoader()
の返り値はsun.misc.Launcher$ExtClassLoader
になる -
getClassLoader().getParent()
の返り値はnull
になる、つまり親は存在しない
- extension class loaderによって読み込まれたクラスの
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
- user class loaderはCLASSPATHの位置にあるクラスを読み込む
- system class loaderと呼ばれることも?
- user class loaderによって読み込まれたクラスの
getClassLoader()
の返り値はsun.misc.Launcher$AppClassLoader
になる -
getClassLoader().getParent()
するとsun.misc.Launcher$ExtClassLoader
が親であることがわかる
example/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