和所有其他对象一样,用户自定义的类装载器以及Class类的实例都放在内存中的堆区,而装载的类型信息则都位于方法区。
ClassLoader中的四个方法是通往Java虚拟机的通道:
// Four of the methods declared in class java.lang.ClassLoader: protected final Class defineClass(String nane, byte data[]r,int offset, int length);
protected final Class defineClass(String name, byte data[],
int offset, int length, ProtectionDomain protectionDomain);
protected final Class findSystemClass(String name);
protected final void resolveClass(Class c);
任何Java虚拟机实现都必须把这些方法连到内部的类装载器子系统中。
两个被重载的defineClass ()方法都要接受一个名为data[]的字节数组作为输人参数,并且 在data[offset]到data[offset +length]之间的二进制数据必须符合Java class文件格式——它表示一 个新的可用类型。而name参数是个字符串,它指出该类型的全限定名。当使用第一个 defineClass ()时,该类型将被赋以默认的保护域。使用第二个defineClass ()时,该类型的保 护域将由它的protectionDomain参数指定。每个Java虚拟机实现都必须保证ClassLoader类的 defineClass ()方法能够把新类型导人到方法区。
resolveClass ()方法接受一个Class实例的引用作为参数,它将对该Class实例表示的类型执 行连接动作。而前面提到的defineClass ()方法则只负责装载。当defineClass ()方法返回一个 Class实例时,也就表示指定的class文件已经被找到并装载到方法区了,但是却不一定被连接和 初始化了。java虚拟机实现必须保证ClassLoader类的resolveClass ()方法能够让类装载器子系 统执行连接动作。