默认类加载器:Bootstrap ClassLoader --> Extension ClassLoader --> Application ClassLoader
其中Bootstrap ClassLoader是JVM级别的,由C++编写。Extension ClassLoader、Application ClassLoader都是Java类。
Bootstrap ClassLoader由JVM启动,然后初始化sun.misc.Launcher
,Launcher初始化Extension ClassLoader、Application ClassLoader。
由于一些特殊的需求:如①加密:Java代码很容易被反编译,如果想对自己的代码进行加密。可先将编译后的代码进行加密,然后再由自定义ClassLoader先解密,然后再加载类。②从非标准来源加载类:可以在自定义ClassLoader中,从指定的来源加载类。
自定义ClassLoader需要继承java.lang.ClassLoader
抽象类,重写findClass
方法,在findClass方法中调用defindClass。
ClassLoader创建时,如果没有指定parent,默认为Application ClassLoader
可以在java.lang.ClassLoader
类中的注释发现该代码
ClassLoader loader = new NetworkClassLoader(host, port);
Object main = loader.loadClass("Main", true).newInstance();
class NetworkClassLoader extends ClassLoader {
String host;
int port;
public Class findClass(String name) {
byte[] b = loadClassData(name);
return defineClass(name, b, 0, b.length);
}
private byte[] loadClassData(String data) {
// load the class data from the connection
}
}