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