java类加载器主要分为如下几种:
jvm提供的类加载器
根类加载器:底层实现,主要加载java核心类库(如:java.lang.*)
扩展类加载器:使用java代码实现,主要加载如:jre/lib/ext/ 下的扩展类库。(父类加载器为根类加载器)
系统类加载器(应用类加载器):使用java代码实现,加载classpath目录下的类。(父类加载器为扩展类加载器)
用户自定义类加载器:去继承ClassLoader类实现自定义类加载器。
类加载器负责将java字节码文件加载到虚拟机内存中也就是类的生命周期的装载过程。(如下为类的生命周期)
类的生命周期图
下面是用户自定义类加载器的实现过程及代码:
实现一个用户自定义类加载器需要去继承ClassLoader类并重写findClass方法,代码如下
package com.space;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
public class MyClassLoader extends ClassLoader {
private String path="/home/luciel/"; //默认加载路径
private String name; //类加载器名称
private final String filetype=".class"; //文件类型
public MyClassLoader(String name) {
// TODO Auto-generated constructor stub
super();
this.name=name;
}
public MyClassLoader(ClassLoader parent,String name){
super(parent);
this.name=name;
}
@Override
public Class> findClass(String name) throws ClassNotFoundException {
// TODO Auto-generated method stub
byte[] b=loadClassData(name);
return defineClass(name, b, 0, b.length);
}
private byte[] loadClassData(String name) {
byte[] data=null;
InputStream in=null;
name