0
点赞
收藏
分享

微信扫一扫

JVM 类加载机制

JakietYu 2022-04-22 阅读 74
javatomcat

一、Java 类加载过程


  1. 初始化:对类的静态变量初始化为指定的值,执行静态代码块。

二、Java 类加载器



1. 自定义类加载器



/**
 * @author wy
 * describe 自定义类加载器
 */
public class MyClassLoader extends ClassLoader {

	@Override
    protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
        return super.loadClass(name, resolve);
    }

	@Override
    protected Class<?> findClass(String className) throws ClassNotFoundException {
        return super.findClass(className);
	}
}	

2. 双亲委派机制


3. 示例——双亲委派机制


package java.lang;

/**
 * @author: wy
 * describe: 双亲委派机制,防止恶意代码替换`JDK`源码,为了保证安全。
 * AppClassLoader -> ExtClassLoader -> BootstrapClassLoader(最终执行)。
 * 1. 类加载器收到类加载请求。
 * 2. `AppClassLoader`将请求委托给父类加载器,一直向上委托,直到`BootstrapClassLoader`。
 * 3. `BootstrapClassLoader`开始加载,可以加载到结束,加载不到则抛出异常,通知子类加载器。
 * 4. `ExtClassLoader`开始加载,可以加载到结束,加载不到则抛出异常,通知子类加载器。
 * 4. 最后`AppClassLoader`开始加载,可以加载到结束,加载不到抛出异常(`ClassNotFoundException`)。
 */
public class String {

    @Override
    public String toString() {
        return "String{}";
    }

    public static void main(String[] args) {
        String string = new String();
        string.toString();
        /*
        错误: 在类 java.lang.String 中找不到 main 方法, 请将 main 方法定义为:
           public static void main(String[] args)
        否则 JavaFX 应用程序类必须扩展javafx.application.Application
         */
    }
}

4. 示例——打破双亲委派机制,验证沙箱安全机制


public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
    // 类路径
    MyClassLoader2 classLoader = new MyClassLoader2("E:\\java\\toobox\\learn\\java-learn\\java-jvm\\src\\main\\java");
    // 包名
    Class clazz = classLoader.loadClass("java.lang.String");
    /*
    java.lang.SecurityException: Prohibited package name: java.lang
    禁止包名称:java.lang
     */
}

5. 打破双亲委派机制



三、Tomcat 类加载器

在这里插入图片描述


1. Tomcat 委派机制



举报

相关推荐

0 条评论