黑马程序员_类加载器

来源:互联网 发布:qq神枪手刷枪软件 编辑:程序博客网 时间:2024/05/19 03:46


------- android培训、java培训、期待与您交流!---------

一、类加载器的树状结构



引导类加载器(bootstrap class loader):它用来加载 Java 的核心库,是用原生代码来实现的,并不继承自 java.lang.ClassLoader。 

扩展类加载器(extensions class loader):它用来加载 Java 的扩展库。Java 虚拟机的实现会提供一个扩展库目录。该类加载器在此目录里面查找并加载 Java 类。 

系统类加载器(system class loader):它根据 Java 应用的类路径(CLASSPATH)来加载 Java 类。一般来说,Java 应用的类都是由它来完成加载的。可以通过 ClassLoader.getSystemClassLoader() 来获取它。


二、类加载器的常用方法

ClassLoader 中与加载类相关的方法方法:

getParent()  返回该类加载器的父类加载器。

loadClass(String name)    加载名称为 name 的类,返回的结果是 java.lang.Class 类的实例。 

findClass(String name)    查找名称为 name 的类,返回的结果是 java.lang.Class 类的实例。   

findLoadedClass(String name)  查找名称为 name 的已经被加载过的类,返回的结果是 java.lang.Class 类的实例。 

defineClass(String name, byte[] b, int off, int len)  把字节数组 b 中的内容转换成 Java 类,返回的结果是 java.lang.Class 类 的实例。这个方法被声明为 final 的。 

resolveClass(Class<?> c)  链接指定的 Java 类。


三、类加载器的委托机制

当Java虚拟机要加载一个类时,到底派出哪个类加载器去加载呢?
1、当前线程的类加载器去加载线程中的第一个类。
2、如果类A中引用了类B,Java虚拟机将使用加载类A的类装载器来加载类B。
3、还可以直接调用ClassLoader.loadClass()方法来指定某个类加载器去加载某个类。
每个类加载器加载类时,又先委托给其上级类加载器。
当所有祖宗类加载器没有加载到类,回到发起者类加载器,还加载不了,则抛ClassNotFoundException,不是再去找发起者类加载器的儿子,因为没有getChild方法,即使有,多个儿子,不知道找哪一个。


线程上下文类加载器(context class loader)是从 JDK 1.2 开始引入的。类 java.lang.Thread 中的方法 getContextClassLoader() 和setContextClassLoader(ClassLoader cl) 用来获取和设置线程的上下文类加载器。如果没有通过 setContextClassLoader(ClassLoader cl) 方法进行设置的话,线程将继承其父线程的上下文类加载器。


四、类加载器的自定义

public class MyClassLoader extends ClassLoader{//从ClassLoader派生@Overrideprotected Class<?> findClass(String name) throws ClassNotFoundException {String classFileName = classDir + "\\"  + name.substring(name.lastIndexOf('.')+1) + ".class";try {FileInputStream fis = new FileInputStream(classFileName);ByteArrayOutputStream  bos = new ByteArrayOutputStream();cypher(fis,bos);fis.close();System.out.println("aaa");byte[] bytes = bos.toByteArray();//从流变成byte数组,之后用byte数组定义类return defineClass(bytes, 0, bytes.length);             //更新的函数为defineClass(String className,byte[] b,int off,int length)



------- android培训、java培训、期待与您交流!---------

0 0
原创粉丝点击