JVM学习笔记7

bilibili-深入理解JVM 虚拟机 学习笔记

JVM学习笔记 1
JVM学习笔记 2
JVM学习笔记 3
JVM学习笔记 4
JVM学习笔记 5
JVM学习笔记 6

P19_自定义类加载器在复杂类加载情况下的运行分析(19)

P20_类加载器命名空间实战剖析与透彻理解(20)

子加载器可以委托父加载器去加载某个类,但父加载器却不能委托子加载器去加载类;
当加载器在加载的类里有引用别的类需要加载时,如果此被引用的类是需要子类加载器则就会报错


命名空间

每个类加载器都有自己的命名空间,命名空间由该类加载器和所有父加载器所加载的类组成(但不包含子类所加载的类);

在这里插入图片描述

父加载器是不能访问子加载器所加载的类的

P21_类加载器实战剖析与疑难点解析(21)

package new_package.jvm.p21;

public class ClassLoaderTest {

    public static void main(String[] args) {
        // bootClassLoader 所加载的路径
        System.out.println(System.getProperty("sun.boot.class.path"));
        // 扩展类加载器 所加载的路径
        System.out.println(System.getProperty("java.ext.dirs"));
        // 系统类加载器 所加载的路径
        System.out.println(System.getProperty("java.class.path"));
    }
}

/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/resources.jar:
/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/rt.jar:
/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/sunrsasign.jar:
/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/jsse.jar:
/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/jce.jar:
/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/charsets.jar:
/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/jfr.jar:
/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/classes
---

/Users/kevin/Library/Java/Extensions:
/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/ext:
/Library/Java/Extensions:
/Network/Library/Java/Extensions:/System/Library/Java/Extensions:
/usr/lib/java
---

/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/charsets.jar:
/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/deploy.jar:
/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/ext/cldrdata.jar:
/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/ext/dnsns.jar:
/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/ext/jaccess.jar:
/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/ext/jfxrt.jar:
/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/ext/localedata.jar:
/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/ext/nashorn.jar:
/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/ext/sunec.jar:
/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/ext/sunjce_provider.jar:
/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/ext/sunpkcs11.jar:
/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/ext/zipfs.jar:
/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/javaws.jar:
/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/jce.jar:
/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/jfr.jar:
/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/jfxswt.jar:
/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/jsse.jar:
/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/management-agent.jar:
/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/plugin.jar:
/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/resources.jar:
/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/rt.jar:
/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/lib/ant-javafx.jar:
/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/lib/dt.jar:
/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/lib/javafx-mx.jar:
/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/lib/jconsole.jar:
/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/lib/packager.jar:
/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/lib/sa-jdi.jar:
/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/lib/tools.jar:
/Users/kevin/Documents/opensource/gitee/java-read-sources-sample/target/classes:
/Users/kevin/.m2/repository/junit/junit/4.12/junit-4.12.jar:
/Users/kevin/.m2/repository/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar:
/Users/kevin/.m2/repository/org/apache/commons/commons-lang3/3.9/commons-lang3-3.9.jar:
/Users/kevin/.m2/repository/cglib/cglib/3.3.0/cglib-3.3.0.jar:
/Users/kevin/.m2/repository/org/ow2/asm/asm/7.1/asm-7.1.jar:
/Users/kevin/.m2/repository/org/openjdk/jol/jol-core/0.10/jol-core-0.10.jar:
/Applications/IntelliJ IDEA.app/Contents/lib/idea_rt.jar

P22_类加载器命名空间深度解析与实例分析(22)

package new_package.jvm.p22;

public class MyPerson {

    private MyPerson myPerson;

    public void setMyPerson(Object o) {
        this.myPerson = (MyPerson) o;
    }
}

import new_package.jvm.p15.MyClassLoader;

import java.lang.reflect.Method;

public class Test1 {

    public static void main(String[] args) throws Exception {

        MyClassLoader loader1 = new MyClassLoader();
        MyClassLoader loader2 = new MyClassLoader();

        Class<?> clazz1 = loader1.loadClass("new_package.jvm.p22.MyPerson");
        Class<?> clazz2 = loader2.loadClass("new_package.jvm.p22.MyPerson");
        System.out.println(clazz1 == clazz2);

        Object object1 = clazz1.newInstance();
        Object object2 = clazz2.newInstance();

        Method method = clazz1.getMethod("setMyPerson", Object.class);
        method.invoke(object1, object2);
    }
}

在这里插入图片描述

P23_类加载器命名空间总结与扩展类加载器要点分析(23)

在这里插入图片描述


package new_package.jvm.p21;

import com.sun.crypto.provider.AESKeyGenerator;

public class ClassLoaderTest2 {

    public static void main(String[] args) {
        System.out.println(AESKeyGenerator.class.getClassLoader());
        System.out.println(ClassLoaderTest2.class.getClassLoader());
    }
}

java -Djava.ext.dirs=./:$JAVA_HOME/jre/lib/ext new_package.jvm.p21.ClassLoaderTest2

sun.misc.Launcher$ExtClassLoader@232204a1
sun.misc.Launcher$AppClassLoader@73d16e93

扩展类加载器加载的是 jar 包,不直接加载 class 文件


jar cvf p21.jar new_package/jvm/p21/ClassLoaderTest2.class

java -Djava.ext.dirs=./:$JAVA_HOME/jre/lib/ext new_package.jvm.p21.ClassLoaderTest2

sun.misc.Launcher$ExtClassLoader@70dea4e
sun.misc.Launcher$ExtClassLoader@70dea4e

P24_平台特定的启动类加载器深入分析与自定义系统类加载器详解(24)

package new_package.jvm.p21;

public class ClassLoaderTest {

    public static void main(String[] args) {
        // bootclassLoader 所加载的路径
        System.out.println(System.getProperty("sun.boot.class.path"));
        // 扩展类加载器 所加载的路径
        System.out.println(System.getProperty("java.ext.dirs"));
        // 系统类加载器 所加载的路径
        System.out.println(System.getProperty("java.class.path"));
    }
}

java new_package.jvm.p21.ClassLoaderTest

/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/resources.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/rt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/sunrsasign.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/jsse.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/jce.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/charsets.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/jfr.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/classes

/Users/kevin/Library/Java/Extensions:/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/jre/lib/ext:/Library/Java/Extensions:/Network/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java

.

在这里插入图片描述
在这里插入图片描述


package new_package.jvm.p15;

import java.io.*;

public class MyClassLoader extends ClassLoader {

    public static final String fileExtension = ".class";

    public MyClassLoader() {
        super();
    }

    public MyClassLoader(ClassLoader classLoader) {
        super(classLoader);
    }

    private byte[] loadClassData(String name) {

        byte[] data = null;
        InputStream inputStream = null;
        OutputStream outputStream = null;
        try {
            System.out.println("---");
            inputStream = new FileInputStream(new File(name));
            outputStream = new ByteArrayOutputStream();
            int ch;
            while (-1 != (ch = inputStream.read())) {
                outputStream.write(ch);
            }
            data = ((ByteArrayOutputStream) outputStream).toByteArray();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                inputStream.close();
                outputStream.close();
            } catch (Exception e2) {
                e2.printStackTrace();

            }
        }
        return data;
    }

    @Override
    protected Class<?> findClass(String name) {
        String fileName = name + fileExtension;
        byte[] bytes = loadClassData(fileName);
        return defineClass(fileName, bytes, 0, bytes.length);
    }

}

package new_package.jvm.p24;
import new_package.jvm.p15.MyClassLoader;
public class MyTest24 {
    public static void main(String[] args) {
        System.out.println(System.getProperty("java.system.class.loader"));
        System.out.println(ClassLoader.getSystemClassLoader());
        System.out.println(MyTest24.class.getClassLoader());
        System.out.println(MyClassLoader.class.getClassLoader());
        // cd target/classes/
        // java -Djava.system.class.loader=new_package.jvm.p15.MyClassLoader new_package.jvm.p24.MyTest24
    }
}

java -Djava.system.class.loader=new_package.jvm.p15.MyClassLoader new_package.jvm.p24.MyTest24

new_package.jvm.p15.MyClassLoader
new_package.jvm.p15.MyClassLoader@4e25154f
sun.misc.Launcher$AppClassLoader@18b4aac2
sun.misc.Launcher$AppClassLoader@18b4aac2
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值