Java类加载器学习笔记

今后一段时间会全面读一下《深入理解Java虚拟机》

在这里先记一下在网上看到的几篇介绍 类加载器 的文章,等读到虚拟机类加载机制再详细介绍。

超详细Java中的ClassLoader详解

深入理解Java类加载器

 

贴一个自己写的类加载器。

Hello类。  把编译后的class文件放到别的路径下。

package ww;

public class Hello {

    public void say() {
        System.out.println("hello world");
    }

}

WwClassLoader类。  继承ClassLoader类 重写 findClass()方法

package ww;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;

public class WwClassLoader extends ClassLoader {

    private String path; //路径
    public WwClassLoader(String path) {
        this.path = path;
    }

    @Override
    protected Class<?> findClass(String name) throws ClassNotFoundException {
        String fileName = parseFileName(name);
        File file = new File(path,fileName);
        try {
            //读取class文件
            FileInputStream fis = new FileInputStream(file);
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            int lenth = 0;
            while((lenth = fis.read()) != -1) {
                baos.write(lenth);
            }
            byte[] buffer = baos.toByteArray();
            baos.close();
            fis.close();
            //实例化class对象
            return defineClass(name,buffer,0,buffer.length);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return super.findClass(name);
    }

    //解析文件路径
    private String parseFileName(String name) {
        int index = name.lastIndexOf('.');
        if(index == -1) {
             return name+".class";
        } else {
            return name.substring(index+1)+".class";
        }
    }
}

WwTest类。   调用测试

package ww;

import java.lang.reflect.Method;

public class WwTest {
    public static void main(String[] args) {
        //我一直在找为什么自己定义的类的parent节点一定是AppClassLoader类的源码。要是知道的大佬可以告诉我一声
        /*private static native void registerNatives();
        static {
            registerNatives();
        }*/
        WwClassLoader ww = new WwClassLoader("E://lib");
        try {
            Class hel = ww.findClass("ww.Hello");
            //反射执行方法
            if (hel != null) {
                Object obj = hel.newInstance();
                Method method = hel.getDeclaredMethod("say", null);
                method.invoke(obj, null);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 

posted @ 2018-04-17 15:36  躲猫猫的猫  阅读(173)  评论(0编辑  收藏  举报