系统类加载器是自定义类加载器的父加载器。若想实现自定义类加载器,需实现java.lang.ClassLoader类。- import java.io.ByteArrayOutputStream;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.InputStream;
-
- public class MyClassLoader extends ClassLoader{
- private String name;//类加载器的名字
- private String path = "F:\\";//加载类的路径
- private static final String fileType = ".class";//文件的扩展名
- public MyClassLoader(String name){
- super();//显式地调用父类构造器,将该加载器的父加载器设置为默认的系统加载器
- this.name = name;
- }
- public MyClassLoader(ClassLoader parent,String name){
- super(parent);//设置该加载器的父加载器
- this.name = name;
- }
- //将java文件中的数据存储到字节数组中
- private byte[] loadClassData(String name){
- byte[] data = null;//存储字节码
- InputStream ips = null;
- ByteArrayOutputStream baos = null;
- try{
- String cname = name.replace(".", "\\");//获取正确的路径格式
- ips = new FileInputStream(new File(path+cname+fileType));
- baos = new ByteArrayOutputStream();
- int ch = 0;
- while(-1 != (ch = ips.read()) ){
- baos.write(ch);//从文件输入流中读取数据,将读到的数据写到字节数组输出流中
- }
- data = baos.toByteArray(); //将输出流中的中的数据存入到字节数组data中。
- ips.close();
- baos.close();//关闭输入输出流
- }catch(Exception ep){
- ep.printStackTrace();
- }
- return data;
- }
-
-
- //获取Class对象 ,在通过父类加载器检查所请求的类后,此方法将 loadClass 方法调用。
- public Class<?> findClass(String name) throws ClassNotFoundException
- //自己定义的加载器覆盖父类的findClass方法。是为了将.class 文件的数据转换成字节码。
- {
- byte[] data = this.loadClassData(name); // 获得2进制数据。
- return this.defineClass(name, data, 0, data.length); //将上述的2进制数据变成class 字节码。
- }
- public String getPath() {
- return path;
- }
- public void setPath(String path) {
- this.path = path;
- }
- public String toString(){
- return this.name;
- }
- //测试方法
- public static void test(ClassLoader loader) throws Exception{
- Class<?> c = loader.loadClass("First");
- c.newInstance();
- }
- public static void main(String[] args) throws Exception {
- MyClassLoader loader1 = new MyClassLoader("loader1"); //创建自己的类加载器名叫loader1
- loader1.setPath("F:\\myapp\\loader1\\");
- MyClassLoader loader2 = new MyClassLoader(loader1,"loader2");
- loader2.setPath("F:\\myapp\\loader2\\");
- test(loader1); // 通过test方法测试 First 类的加载。
- test(loader2);
- }
- }
复制代码 |