类加载器和机制
类加载器实现
一个简单的类加载器的实现就是实现 ClassLoader 抽象类的 loadClass()函数
package tk.youngdou;
import java.io.IOException;
import java.io.InputStream;
public class ClassLoaderTest {
public static void main(String[] args) {
createClassLoader("");
}
private static void createClassLoader(String name) {
ClassLoader myLoader = new ClassLoader() {
@Override
public Class<?> loadClass(String name) throws ClassNotFoundException {
try{
String filename = name.substring(name.lastIndexOf(".") + 1) + ".class";
InputStream is = getClass().getResourceAsStream(filename);
if (is == null) {
return super.loadClass(name);
}
byte[] b = new byte[is.available()];
is.read(b);
return defineClass(name, b, 0, b.length);
} catch (IOException e) {
e.printStackTrace();
throw new ClassNotFoundException(name);
}
}
};
ClassLoader classLoader_mine = myLoader;
ClassLoader classLoader_app = myLoader.getParent();
ClassLoader classLoader_ext = classLoader_app.getParent();
ClassLoader classLoader_boot = classLoader_ext.getParent();
System.out.println(classLoader_mine.toString());
System.out.println(classLoader_app.toString());
System.out.println(classLoader_ext.toString());
System.out.println(classLoader_boot);
}
}
输出
tk.youngdou.ClassLoaderTest$1@4554617c
sun.misc.Launcher$AppClassLoader@14dad5dc
sun.misc.Launcher$ExtClassLoader@74a14482
null
原理
那么自定义的类加载器可以不继承 AppClassLoader 吗?
一般来说,不行。
- 首先ClassLoader没有 setParent()函数。
- ClassLoader的已经硬编码了
具体直接上代码
类:ClassLoader.class
image.png类:ClassLoader.class
image.png类:ClassLoader.class
image.png类:Launcher.class
image.pngclassloader 其实在初始化的时候就设定为应用加载器
类:Launcher.class
image.png参考
《深入理解java虚拟机》——周志明