类加载器1

http://ifeve.com/classloader/

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的类加载器来进行加载。

猜你喜欢

转载自my.oschina.net/2016jyh/blog/1788994