代码拉取完成,页面将自动刷新
同步操作将从 icanci/Java-Review 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
加载
加载 .class 文件的方式
链接
public class HelloApp {
// prepare:a 赋值为默认值-零值
// 初始化的时候:a赋值为1
// 数据的类型不一样,初始值也不一样
private static int a = 1;
public static void main(String[] args) {
System.out.println(a);
}
}
初始化操作
public class ClinitTest {
static class Father {
public static int A = 1;
static {
A = 2;
}
}
static class Son extends Father {
public static int B = A;
}
public static void main(String[] args) {
// 加载Father类
// 加载Son类
System.out.println(Son.B);
}
}
public class ClassLoaderTest {
public static void main(String[] args) {
// 获取系统类加载器
ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
// sun.misc.Launcher$AppClassLoader@18b4aac2
System.out.println(systemClassLoader);
// 获取其上层:拓展类加载器
ClassLoader parent = systemClassLoader.getParent();
// sun.misc.Launcher$ExtClassLoader@1540e19d
System.out.println(parent);
// 获取顶层加载器 BootStrapClassLoader 获取不到 因为C/C++写的
ClassLoader parent1 = parent.getParent();
// null
System.out.println(parent1);
// 对于用户来说 默认使用的是系统类加载器
ClassLoader classLoader = ClassLoaderTest.class.getClassLoader();
// sun.misc.Launcher$AppClassLoader@18b4aac2
System.out.println(classLoader);
// sun.misc.Launcher$ExtClassLoader@1540e19d
ClassLoader parent2 = classLoader.getParent();
System.out.println(parent2);
// 在上层
// null
ClassLoader parent3 = parent2.getParent();
System.out.println(parent3);
// Java的核心类库都是使用引导类加载的
// String 类是使用引导类加载器加载的
ClassLoader classLoader1 = String.class.getClassLoader();
System.out.println(classLoader1);
}
}
虚拟机自带的加载器
启动类加载器(引导类加载器 Bootstrap ClassLoader)
拓展类加载器 (Extension ClassLoader)
应用程序类加载器(系统类加载器 AppClassLoader)
public class ClassLoaderTest1 {
public static void main(String[] args) {
System.out.println("启动类加载器");
URL[] urLs = Launcher.getBootstrapClassPath().getURLs();
for (URL urL : urLs) {
System.out.println(urL.toString());
}
System.out.println("拓展类加载器");
String property = System.getProperty("java.ext.dirs");
for (String path : property.split(";")) {
System.out.println(path);
}
}
}
启动类加载器
file:/D:/jdk/jdk1.8/jre/lib/resources.jar
file:/D:/jdk/jdk1.8/jre/lib/rt.jar
file:/D:/jdk/jdk1.8/jre/lib/sunrsasign.jar
file:/D:/jdk/jdk1.8/jre/lib/jsse.jar
file:/D:/jdk/jdk1.8/jre/lib/jce.jar
file:/D:/jdk/jdk1.8/jre/lib/charsets.jar
file:/D:/jdk/jdk1.8/jre/lib/jfr.jar
file:/D:/jdk/jdk1.8/jre/classes
拓展类加载器
D:\jdk\jdk1.8\jre\lib\ext
C:\WINDOWS\Sun\Java\lib\ext
工作原理
接口是由引导类加载器加载,而接口的实现则是由系统类加载器加载
优势
抛出异常 java.lang.SecurityException: Prohibited package name: java.lang
在JVM中表示两个Class对象是否为同一个类存在的两个必要条件
换句话说,在JVM中,即使这两个类对象(Class对象)来源于同一个Class文件,被同一个虚拟机加载,只要加载它们的ClassLoader对象不同,那么这两个类对象也是不相等的
JVM必须知道一个类型是由启动加载器的还是由用户加载器加载的。如果一个类型是由用户类加载器加载的,那么JVM会将这个类加载器的一个引用作为类型信息的一部分保存在方法区内,当解析一个类型到另一个类型的引用的时候,JVM需要保证这两个类型的加载器是相同的。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。