A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 欢欢 高级黑马   /  2014-4-12 10:53  /  658 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 欢欢 于 2014-4-14 21:26 编辑

看到基础加强的自定义类加载器的编写原理分析,有些不懂:
问题:loadClass方法返回的本身就是Class类的对象嘛,怎么又要将二进制数据转换成字节码?用defineClass去做。是什么意思?

评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1

查看全部评分

1 个回复

倒序浏览
一、类加载器类别
*  1.java虚拟机自带的加载器
*   根类加载器(Bootstrap,c++实现)
*    扩展类加载器(Extension,java实现)
*    系统类加载器(System,java实现)
*  2.用户自定义的类加载器
*    java.lang.ClassLoader的子类
*    用户可以定制类的加载方式
/**
*
* 一、ClassLoader加载类的顺序
*  1.调用 findLoadedClass(String) 来检查是否已经加载类。
*  2.在父类加载器上调用 loadClass 方法。如果父类加载器为 null,则使用虚拟机的内置类加载器。
*  3.调用 findClass(String) 方法查找类。
* 二、实现自己的类加载器
*         1.获取类的class文件的字节数组
*         2.将字节数组转换为Class类的实例
*
*/
public class ClassLoaderTest {

        public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
                //新建一个类加载器
                MyClassLoader cl = new MyClassLoader("myClassLoader");
                //加载类,得到Class对象
                Class<?> clazz = cl.loadClass("classloader.Animal");
                //得到类的实例
                Animal animal=(Animal) clazz.newInstance();
                animal.say();
        }

}
class Animal{
        public void say(){
                System.out.println("hello world!");
        }
}
class MyClassLoader extends ClassLoader {
        //类加载器的名称
        private String name;
        //类存放的路径
        private String path = "E:\\workspace\\Algorithm\\src";

        MyClassLoader(String name) {
                this.name = name;
        }
       
        MyClassLoader(ClassLoader parent, String name) {
                super(parent);
                this.name = name;
        }
        /**
         * 重写findClass方法
         */
        @Override
        public Class<?> findClass(String name) {
                byte[] data = loadClassData(name);
                return this.defineClass(name, data, 0, data.length);
        }
        public byte[] loadClassData(String name) {
                try {
                        name = name.replace(".", "//");
                        FileInputStream is = new FileInputStream(new File(path + name + ".class"));
                        ByteArrayOutputStream baos = new ByteArrayOutputStream();
                        int b = 0;
                        while ((b = is.read()) != -1) {
                                baos.write(b);
                        }
                        return baos.toByteArray();
                } catch (Exception e) {
                        e.printStackTrace();
                }
                return null;
        }

}

评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马