1. 实现自己的类加载器必须首先继承一个父类加载器.
编写一个类加载器会涉及到以下几个方法:
1. findClass(String name) 根据类的路径查找类,必须重写的方法
2.defineClass(String name, byte[] b, int off, int len) 由父类实现,直接调用
编写一个类加载器会涉及到以下几个方法:
1. findClass(String name) 根据类的路径查找类,必须重写的方法
2.defineClass(String name, byte[] b, int off, int len) 由父类实现,直接调用
3.loadClass(String name)首先调用父类的findClass方法找,找不到则调用自身重写的findClass方法找,也不需要我们实现.loadClass(String name)默认会调用 loadClass(name,false)方法,表示只加载,不发生连接操作.JDK的ClassLoader类的loadClass(String name,boolean resolve)
谈一下loadClass()和forName()的区别.
从上可以看出调用loadClass(name),相当于调用loadClass(name,false),表示只加载类,不连接初始化类,调用newInstance()才真正完成连接初始化操作.
Class.forName("xxxx")等同于Class.forName("xxxx",true,loader).true,表示载入实例的同时也载入静态初始化区块;false,表示只会加载该类别,但不会调用其静态初始化区块,只有等到整个程序第一次实例化某个类时,静态初始化区块才会被调用
在大多情况下loadClass()和forName()可以互用, 可以把ClassLoader.loadClass()看成是更底层的操作.在某些必须初始化类的场合,比如加载JDBC驱动,只能使用forName()方法了