类加载器
Posted xupccc
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了类加载器相关的知识,希望对你有一定的参考价值。
类加载器
1、介绍
类加载器,加载类到JVM中。主要做的寻找类,通过将完整类名映射成相应的目录,按照目录进行搜索。尝试使用当前的类加载器,如果加载不到,再使用父加载器加载,否则再向上找。
类加载过程是使用当前类的类加载加载指定的类的,如果加载不到,再使用上级类加载器进行加载。
2、java ClassLoader
java类加载时三级类加载机制,分别是:
Bootstrap
加载jdk的核心类,即java.lang包下的类,该类无法在程序中获得,返回的始终是null。
//loader为null,jdk下的类加载是Bootstrap类加载。 ClassLoader loader = Integer.class.getClassLoader(); System.out.println(loader) ;
?
ExtClassLoader
扩展类加载器,加载jre/lib/*.jar中的类,父加载器是BootstrapClassLoader。
//ExtClaassLoader, ClassLoader loader = javax.jnlp.BasicService.class.getClassLoader(); System.out.println(loader) ;
?
AppClassLoader
加载自定义的第三方类,ExtClassLoader是父加载器。
//AppClassLoader,自定义的类使用AppClassLoader ClassLoader loader = Hello.class.getClassLoader(); System.out.println(loader) ;
?
3、自定义类加载器
自定义类加载器是从特定的方式读取字节码文件后,形成字节数组,在通过defineClass方法恢复成类即可。使用时创建自己的ClassLoader对象,调用器loadClass方法。代码如下:
package com.oldboy.java.jvm;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
/**
* 自定义类加载
*/
public class MyClassLoader extends ClassLoader{
protected Class<?> findClass(String name) throws ClassNotFoundException {
try {
//指定加载的特定路径
String path = "d:\java\" + name + ".class" ;
FileInputStream fis = new FileInputStream(path) ;
ByteArrayOutputStream baos = new ByteArrayOutputStream() ;
byte[] buf = new byte[1024] ;
int len = -1 ;
while((len = fis.read(buf)) != -1){
baos.write(buf , 0 , len);
}
baos.close();
fis.close();
byte[] data = baos.toByteArray();
Class clz = defineClass(data , 0 , data.length) ;
return clz ;
} catch (Exception e) {
e.printStackTrace();
}
return null ;
}
}
调用自定义的类加载器,加载指定的类:
/**
*
*/
public static void main(String[] args) throws Exception {
ClassLoader loader = new MyClassLoader();
//加载自己的类
Class clz = loader.loadClass("Hello") ;
IByeService bs = (IByeService) clz.newInstance();
bs.sayBye("tomtomt");
}
4、类加载过程
类加载时会加载用到的所有的类,类的静态代码块是类加载期间的初始化工作,可以关闭在类加载期间进行初始化。通过Class.forName(String String ,boolean init , ClassLoader loader)进行控制。
以上是关于类加载器的主要内容,如果未能解决你的问题,请参考以下文章
活动(加载器 - 下载)+ 3 个片段(使用加载器 - 计算)
用于在多个活动/片段中重用的全局加载器 (LoaderManager)
Android 逆向ART 脱壳 ( DexClassLoader 脱壳 | DexClassLoader 构造函数 | 参考 Dalvik 的 DexClassLoader 类加载流程 )(代码片段
Android 逆向ART 脱壳 ( DexClassLoader 脱壳 | DexClassLoader 构造函数 | 参考 Dalvik 的 DexClassLoader 类加载流程 )(代码片段