门户网站制作企业,建造师个人业绩查询,浙江建设厅网站首页,wordpress微商城模板文章目录 1、双亲委派机制2、Java代码中去主动加载一个类3、“父”加载器4、Q A5、打破双亲委派机制 1、双亲委派机制 JVM中有多个类加载器#xff0c;某个类A#xff0c;到底该由谁去加载 ⇒ 双亲委派机制 该机制的作用#xff1a;
保证类加载的安全性#xff1a;避… 文章目录 1、双亲委派机制2、Java代码中去主动加载一个类3、“父”加载器4、Q A5、打破双亲委派机制 1、双亲委派机制 JVM中有多个类加载器某个类A到底该由谁去加载 ⇒ 双亲委派机制 该机制的作用
保证类加载的安全性避免用户自定义一个java.lang.String恶意替换JDK的核心类库里的String类避免重复加载避免同一个类被多次加载提高效率
该机制的内容是当一个类加载接收到加载类的任务时
自底向上查找是否已经被父加载器加载过有则直接返回若没被加载再自顶向下进行加载
从下往上查找是否被加载过没有则委派给父类加载器 若全都没有被加载过则从启动类加载器开始加载当要加载的类不在启动类加载器的加载范围时往下走到扩展类加载器以此类推。 这种机制的好处是控制了加载优先级一个类优先去由启动类加载器去尝试加载 2、Java代码中去主动加载一个类 方式一Class.forName( )使用当前类的加载器去加载 方式二classLoader对象.loadClass( )使用指定的加载器对象去加载
public class LoaderTest {public static void main(String[] args) throws ClassNotFoundException, IOException {//自己写的类ClassLoader classLoader TestJvm.class.getClassLoader();System.out.println(classLoader);//尝试用应用类加载器去加载String类Class? clazz classLoader.loadClass(java.lang.String);System.out.println(clazz.getClassLoader());}
}运行结果的null即说明还是用的启动类加载器加载的String体现了双亲委派机制 3、“父”加载器
双亲委派机制里的父加载器这个父不是Java继承的那个父只是类加载器对象中有个成员变量叫parent是上级关系不是有继承关系。 应用程序加载器的parent属性为扩展类加载器而扩展类加载器的parent为null这是由于Java代码中没法拿到启动类加载器的对象因此赋值为null。启动类加载器用c编写没有父加载器 Arthas工具查看类加载器的父子关系
classloader -t4、Q A
Q双亲委派机制A
某个类加载器加载一个类时向上查找、向下加载有加载过则直接返回到顶层类加载器也没被加载过再向下加载应用程序类加载器的父加载器是扩展类加载器扩展类加载器的父加载器是启动类加载器启动类加载器无父加载器好处是避免恶意替换JDK核心类以及避免重复加载
Q如果一个类被三种类加载器都无法加载A返回ClassNotFountException
Q一个类重复出现在三个类加载器的范围由谁来加载A由启动类加载器其优先级最高
Q自己的项目新建一个java.lang.String能否被加载A否会由启动类加载器加载JDK/rt.jar包下的String类
5、打破双亲委派机制
该机制下向上查找、向下加载如果有两个全类名相同的类但内容不同就只会有一个被加载。如Tomcat上运行多个web应用其中两个web应用里都有com.plat.MyServlet类则双亲委派机制下后者不会被加载 Tomcat使用了自定义类加载器来实现应用之间类的隔离。每一个应用会有一个独立的类加载器加载对应的类。 想打破类的双亲委派机制方法有