码迷,mamicode.com
首页 > 编程语言 > 详细

Java类加载器学习笔记

时间:2018-04-17 16:49:48      阅读:159      评论:0      收藏:0      [点我收藏+]

标签:java虚拟机   get   详解   end   hello   register   源码   虚拟   row   

今后一段时间会全面读一下《深入理解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();
        }
    }
}

 

Java类加载器学习笔记

标签:java虚拟机   get   详解   end   hello   register   源码   虚拟   row   

原文地址:https://www.cnblogs.com/zhaww/p/8867065.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!