美文网首页
Java类加载器

Java类加载器

作者: 老猫头 | 来源:发表于2017-06-05 21:56 被阅读25次

Java类加载器###

类加载器就是寻找类的字节码文件并构造出类在JVM内部表示的对象组件。在JAVA中,类装载器把一个类装入到JVM中,需要经过以下步骤:

  • 装载:查找和导入class文件

  • 连接:执行校验、准备和解析步骤,其中解析步骤是可以选择的:

    1. 校验:检查载入Class文件数据的正确性;
    2. 准备:给类的静态变量分配存储空间;
    3. 解析:将符号引用转成直接引用;
  • 初始化:对类的静态变量,静态代码块执行初始化工作。

类装载工作由ClassLoader及其子类负责,ClassLoader是一个重要的Java运行时系统组件,它负责在运行时查找和装入Class字节码文件。JVM在运行时会产生三个ClassLoader;根装载器,ExtClassLoader和AppClassLoader。其中根装载器不是ClassLoader,是使用C++写的,在Java中看不到它,根装载器负责JRE核心类库的装载。 ExtClassLoader和AppClassLoader都是ClassLoader的子类。其中ExtClassLoader负责装载JRE扩展目录ext中的JAR类包;AppClassLoader负责装载ClassPath路径下的类包。

这三个类装载器存在父子层级关系,即根装载器是ExtClassLoader的父装载器。ExtClassLoader是AppClassLoader的父装载器。默认情况下使用AppClassLoader装载应用程序的类。

/**
 * Created by Administrator on 2017/6/5.
 */
public class ClassLoaderTest {
    public static void main(String[] args) {
        ClassLoader loader = Thread.currentThread().getContextClassLoader();
        System.out.println("current loader:"+loader);
        System.out.println("parent loader:"+loader.getParent());
        System.out.println("grantparent loader:"+loader.getParent().getParent());
    }
}

运行结果

current loader:sun.misc.Launcher$AppClassLoader@e1641c0
parent loader:sun.misc.Launcher$ExtClassLoader@5736ab79
grantparent loader:null

JVM装载类时使用“全盘负责委托机制”,“全盘负责”是指当一个ClassLoader装载一个类时,除非显式的使用另一个ClassLoader,该类所依赖及引用的类也由这个ClassLoader载入;

“委托机制”是指先委托父装载器寻找目标类,只有在找不到的情况下才从自己的类路径中查找并装载目标类。这一点是从安全角度考虑的,可以有效的防止恶意的覆盖基础类的行为。

ClassLoader的重要方法:

根据全路径名装载类

public Class<?> loadClass(String name) throws ClassNotFoundException {
    return loadClass(name, false);
}

从本地文件系统中载入Class文件

 protected final Class<?> findSystemClass(String name)
    throws ClassNotFoundException
{
    ClassLoader system = getSystemClassLoader();
    if (system == null) {
        if (!checkName(name))
            throw new ClassNotFoundException(name);
        Class cls = findBootstrapClass(name);
        if (cls == null) {
            throw new ClassNotFoundException(name);
        }
        return cls;
    }
    return system.loadClass(name);
}

获得父类装载器

public final ClassLoader getParent() {
        if (parent == null)
            return null;
        SecurityManager sm = System.getSecurityManager();
        if (sm != null) {
            checkClassLoaderPermission(parent, Reflection.getCallerClass());
        }
        return parent;
    }

Java的反射机制

Class反射对象描述类语意结构,可以从Class对象中获取构造函数、成员变量、方法类等类元素的反射对象,并以编程的方式通过这些反射对象对目标类对象进行操作。这些反射对象类在java.reflect包中定义。

  • Constructor :类的构造函数反射类。
  • Method:类方法的反射类。
  • Field,类的成员变量的反射类。

相关文章

网友评论

      本文标题:Java类加载器

      本文链接:https://www.haomeiwen.com/subject/rtpwfxtx.html