ClassLoader
ClassLoader在Java语言中占据了核心地位,Java应用服务器,OSGi,以及大量的网络框架,它们大多数都用到了ClassLoader
classLoader对象和Class对象 (类的类型)
每个ClassLoader对象都是一个java.lang.ClassLoader的实例。每个Class对象都被这些ClassLoader对象所加载,通过继承java.lang.ClassLoader可以扩展出自定义ClassLoader,并使用这些自定义的ClassLoader对类进行加载。
classLoader抽象类
先大体了解一下ClassLoader的API
package java.lang;
public abstract class ClassLoader {
public Class loadClass(String name);
protected Class defineClass(byte[] b);
public URL getResource(String name);
public Enumeration getResources(String name);
public ClassLoader getParent();
}
1. loadClass(String name)方法
最重要的是ClassLoader的loadClass方法,它接受一个全类名,然后返回一个Class类型的实例(类类型对象)。
2. defineClass(byte[] b)
defineClass方法接受一组字节,然后将其具体化为一个Class类型实例,它一般从磁盘上加载一个文件,然后将文件的字节传递给JVM,通过JVM(native 方法)对于Class的定义,将其具体化,实例化为一个Class类型实例。
3. getParent();
getParent方法返回其parent ClassLoader。
4.getResources和getResource
getResource和getResources方法,从给定的repository中查找URLs,同时它们也具备类似loadClass一样的代理机制,我们可以将loadClass视为:defineClass(getResource(name).getBytes())。
普通类的加载
Java由于其晚绑定和“解释型”的特性,类型的加载是到最晚才进行,一个类型直到被调用构造函数、静态方法或者在字段上使用时才会被加载。
考虑如下代码:
public class A {
public void doSomething() {
B b = new B();
b.doSomethingElse();
}
}
在A中使用B类
代码:B b = new B();
等同于B b = Class.forName(“B”, false, A.class.getClassLoader()).newInstance();
这代表着,在类型A中使用到的类型,将由加载了类型A的类加载器来进行加载。