美文网首页
26_类加载

26_类加载

作者: lww文 | 来源:发表于2020-10-16 17:55 被阅读0次

    顾名思义,类加载器(class loader)用来加载 Java 类到 Java 虚拟机中。一般来说,Java 虚拟机使用 Java 类的方式如下:Java 源程序(.java 文件)在经过 Java 编译器编译之后就被转换成 Java 字节代码(.class 文件)。类加载器负责读取 Java 字节代码,并转换成 java.lang.Class 类的一个实例。每个这样的实例用来表示一个 Java 类。通过此实例的 newInstance() 方法就可以创建出该类的一个对象。

    类的加载过程

    =========类加载器:

    ========classloader

    所有的类加载器 除了 根类加载器 之外 都得继承  classloader

    classloader  有4个主要方法

    1=== loadclass  2==:findcalss  3:==defineclass 4reloerclass

    ==========findClass

    ========defineClass

    =====resolveClass

    ===========URLClassloader

    demo1  加载磁盘类

    1:创建Test 类

    =================

    public class Test {

        public Test (){

        System.out.println("666");

        }

    }

    =================

    2:创建 测试类

    ============

    public class MyClass {

    public static void main(String[] args)throws  Exception {

    File file=new File("e:/");

            URI uri = file.toURI();

            URL url = uri.toURL();  //  加载地址

            URLClassLoader urlClassLoader=new URLClassLoader(new URL[]{url});

            System.out.println("URLClassLoader父加载器"+urlClassLoader.getParent());

            Class aClass = urlClassLoader.loadClass("Test");

            aClass.newInstance();

        }

    }

    ============

    =====自定义类加载器

    1:继承类加载器

    2:  覆盖findClass方法

    =================================

    // 1 继承ClassLoader

    //  2

    public class MyClassloadextends ClassLoader {

    private Stringdictory; //被加载类所在目录

        public MyClassload(String dictory) {// 默认加载器是系统类加载器

            this.dictory = dictory;

        }

    public MyClassload(ClassLoader parent, String dictory) {

    super(parent);

            this.dictory = dictory;

        }

    @Override

        protected ClassfindClass(String name)throws ClassNotFoundException {

    //    把类名转为目录

            String file =dictory + File.separator + name.replace(".", File.separator) +".class";

            try {

    //      构建输入流

                InputStream ins =new FileInputStream(file);

    //        构建输出流

                ByteArrayOutputStream baos =new ByteArrayOutputStream();

                byte[] bytes =new byte[1024];

                int len = -1;

                while ((len = ins.read(bytes)) != -1) {

    baos.write(bytes, 0, len);

                }

    byte data[]  = baos.toByteArray();//  读取到字节吗的二进制数据

                ins.close();

                baos.close();

                return defineClass(name,data,0,data.length);

            }catch ( Exception e) {

    e.printStackTrace();

                throw  new  RuntimeException(e);

            }

    }

    public static void main(String[] args)throws  Exception {

    MyClassload myClassload=new MyClassload("e:/");

            Class test = myClassload.loadClass("Test");

            test.newInstance();

        }

    }

    =================================

    自定义网络类加载器

    相关文章

      网友评论

          本文标题:26_类加载

          本文链接:https://www.haomeiwen.com/subject/znxtmktx.html