26_类加载

2020-10-16  本文已影响0人  lww文

顾名思义,类加载器(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();

    }

}

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

自定义网络类加载器

上一篇 下一篇

猜你喜欢

热点阅读