LoginSignup
14
10

More than 5 years have passed since last update.

Javaのclass loaderの種類について

Last updated at Posted at 2017-01-22

Javaのclass loaderについてまとめる。

boostrap class loader

  • bootstrap class loaderはbootstrap classを読み込む
    • bootstrap classはjre/lib/rt.jarjre/lib/以下の.jarに存在するクラスのことである
      • Macだと/Library/Java/JavaVirtualMachines/jdk1.x.x_xxx.jdk/Contents/Home/jre/lib/rt.jar など
    • JVMに付属しているclass loaderであり、JVM起動時にクラスを読み込むのに使用される
    • bootstrap class loaderによって読み込まれたクラスのgetClassLoader()の返り値は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

  • extension class loaderはjre/lib/ext以下の.jarを読み込む
    • extension class loaderによって読み込まれたクラスのgetClassLoader()の返り値はsun.misc.Launcher$ExtClassLoaderになる
    • getClassLoader().getParent()の返り値はnullになる、つまり親は存在しない
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

参考URL

14
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
10