创建网站的基本步骤,河北seo网站优化公司,怎么做免费推广网站,网站开发工资有多少双亲委派可以简单理解为, 当收到加载请求时, 会依次向上加载 ; 只有当父类加载器无法完成加载请求时#xff0c;子类加载器才会尝试自己去加载。
工作原理
类加载请求传递#xff1a;当应用程序需要加载一个类时#xff0c;比如通过ClassLoader.loadClass()方法#xff0…双亲委派可以简单理解为, 当收到加载请求时, 会依次向上加载 ; 只有当父类加载器无法完成加载请求时子类加载器才会尝试自己去加载。
工作原理
类加载请求传递当应用程序需要加载一个类时比如通过ClassLoader.loadClass()方法首先会由应用程序类加载器通常是系统类加载器接收到这个请求。然后它会将这个请求委托给它的父类加载器 —— 扩展类加载器。扩展类加载器又会将请求进一步委托给启动类加载器。类加载尝试顺序启动类加载器首先尝试加载类如果它能找到并加载这个类那么就完成了类加载过程。如果启动类加载器无法加载它会将任务返回给扩展类加载器让扩展类加载器尝试加载。如果扩展类加载器也无法加载就再将任务返回给应用程序类加载器由应用程序类加载器尝试加载。如果应用程序类加载器也无法加载才会抛出ClassNotFoundException异常。
作用
避免类的重复加载通过双亲委派机制当一个类已经被某个类加载器加载过了那么其他类加载器就不会再次加载它保证了类在整个 Java 虚拟机中只有一份实例节省了内存空间也避免了因类的重复加载而可能导致的各种问题。保证类的安全性它确保了 Java 核心类库的安全性。例如java.lang.Object类是由启动类加载器加载的其他类加载器在加载类时如果需要加载java.lang.Object类都会委托给启动类加载器这样就保证了所有的类都使用的是 Java 核心类库中的Object类而不是被恶意篡改过的版本防止了核心类被非法替换或篡改。
import java.io.IOException;
import java.io.InputStream;public class MyClassLoader extends ClassLoader {Overrideprotected Class? loadClass(String name, boolean resolve) throws ClassNotFoundException {// 首先检查该类是否已经被加载过Class? c findLoadedClass(name);if (c null) {try {// 尝试使用父类加载器加载if (getParent()! null) {c getParent().loadClass(name);} else {// 如果父类加载器为null说明已经到了启动类加载器使用系统类加载器加载c ClassLoader.getSystemClassLoader().loadClass(name);}} catch (ClassNotFoundException e) {// 如果父类加载器无法加载则尝试自己加载c findClass(name);}}if (resolve) {resolveClass(c);}return c;}Overrideprotected Class? findClass(String name) throws ClassNotFoundException {// 自定义类加载逻辑从文件或网络等获取类的字节码// 这里只是简单示例实际应用中需要根据具体情况实现String className name.substring(name.lastIndexOf(.) 1) .class;InputStream is getClass().getResourceAsStream(className);if (is null) {throw new ClassNotFoundException(name);}try {byte[] b new byte[is.available()];is.read(b);return defineClass(name, b, 0, b.length);} catch (IOException e) {throw new ClassNotFoundException(name);}}
}MyClassLoader类继承自ClassLoader类重写了loadClass方法来实现双亲委派机制。首先会检查类是否已经被加载过如果没有则先尝试使用父类加载器加载如果父类加载器无法加载再尝试自己加载。findClass方法用于自定义类的加载逻辑这里只是简单地从当前类所在的路径下读取类的字节码