标签:网络 UNC 字段 用户创建 app raw image 核心 默认
| 你妈妈[ClassLoader]给你[Execution Engine]找到相亲姑娘,是否能成得看你自己的本事
| 运行时常量池:常量池在运行时加载到内存里,就叫做运行时常量池
| 加载.class文件的方式
| 符号引用:一组符号来描述所引用的目标。符号引用的字面量形式明确定义在《java虚拟机规范》的Class文件格式中。
| 直接引用:直接指向目标的指针、相对偏移量或一个间接定位到目标的句柄
CONSTANT_Class_info
、CONSTANT_Fieldref_info
、CONSTANT_Methodref_info
等。
| 没有定义<clinit>(),但是在二进制文件中<clinit>()方法存在
| 如果没有给变量赋值,也没有静态代码块,就不会有<clinit>()方法
| 前向引用
| 一个类只会被加载一次,也就是说只会调用一次<clinit>方法,类第一次被加载之后,会在内存中缓存起来,下次再使用这个类,直接从内存中取。
| 举例说明:假设现在有两个线程th1,th2都想要加载类TestClass,如果线程th1抢到加载类的语句TestClass t = new TestClass(),th1就去加载类,因为会被同步加锁,th2就进不去加载类的方法,所以只会有一个线程可以成功打印初始化语句
7.获取不同类的加载器代码演示
/** * ClassLoader加载 */ public class ClassLoaderTest { public static void main(String[] args) { //获取系统类加载器 ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader(); System.out.println(systemClassLoader);//sun.misc.Launcher$AppClassLoader@18b4aac2 //获取其上层 扩展类加载器 ClassLoader extClassLoader = systemClassLoader.getParent(); System.out.println(extClassLoader);//sun.misc.Launcher$ExtClassLoader@610455d6 //获取其上层 获取不到引导类加载器 ClassLoader bootStrapClassLoader = extClassLoader.getParent(); System.out.println(bootStrapClassLoader);//null //对于用户自定义类来说:使用系统类加载器进行加载 ClassLoader classLoader = ClassLoaderTest.class.getClassLoader(); System.out.println(classLoader);//sun.misc.Launcher$AppClassLoader@18b4aac2 //String 类使用引导类加载器进行加载的 -->java核心类库都是使用引导类加载器加载的 ClassLoader classLoader1 = String.class.getClassLoader(); System.out.println(classLoader1);//null获取不到间接证明了String 类使用引导类加载器进行加载的 } }
?? /** * 虚拟机自带加载器 */ public class ClassLoaderTest1 { public static void main(String[] args) { System.out.println("********启动类加载器*********"); // 1. 获取BootStrapClassLoader能够加载的api路径 URL[] urls = sun.misc.Launcher.getBootstrapClassPath().getURLs(); /* 打印结果 file:/E:/software/java/java/jdk/jdk1.8.0_131/jre/lib/resources.jar file:/E:/software/java/java/jdk/jdk1.8.0_131/jre/lib/rt.jar file:/E:/software/java/java/jdk/jdk1.8.0_131/jre/lib/sunrsasign.jar file:/E:/software/java/java/jdk/jdk1.8.0_131/jre/lib/jsse.jar file:/E:/software/java/java/jdk/jdk1.8.0_131/jre/lib/jce.jar file:/E:/software/java/java/jdk/jdk1.8.0_131/jre/lib/charsets.jar file:/E:/software/java/java/jdk/jdk1.8.0_131/jre/lib/jfr.jar file:/E:/software/java/java/jdk/jdk1.8.0_131/jre/classes */ for (URL e:urls){ System.out.println(e.toExternalForm()); } // 2. 从上面的路径中随意选择一个类 看看他的类加载器是什么 //Provider位于 /jdk1.8.0_171.jdk/Contents/Home/jre/lib/jsse.jar 下 ClassLoader classLoader = Provider.class.getClassLoader(); // 3. 引导类加载器是获取不到的,这里为null也可以说明该类是由引导类加载器获取的 System.out.println(classLoader);//null System.out.println("********拓展类加载器********"); // 扩展类加载器从java.ext.dirs系统属性所指定的目录中加载类库 String extDirs = System.getProperty("java.ext.dirs"); // E:\software\java\java\jdk\jdk1.8.0_131\jre\lib\ext // C:\Windows\Sun\Java\lib\ext for (String path : extDirs.split(";")){ System.out.println(path); } //从上面的路径中随意选择一个类 看看他的类加载器是什么:拓展类加载器 ClassLoader classLoader1 = CurveDB.class.getClassLoader(); System.out.println(classLoader1);//sun.misc.Launcher$ExtClassLoader@4dc63996 } }
clazz.getClassLoader()
Thread.currentThread.getContextClassLoader()
ClassLoader.getSystemClassLoader()
DriverManager.getCallerClassLoader()
标签:网络 UNC 字段 用户创建 app raw image 核心 默认
原文地址:https://www.cnblogs.com/qiu-hua/p/13226471.html