网站开发需要多线程吗,专业定制网站建设公司,世界十大广告公司排名,北京建设网坡屋顶改造工程指标基本说明
反射机制是Java实现动态语言的关键#xff0c;也就是通过反射实现类动态加载。
静态加载#xff1a;编译时加载相关的类#xff0c;如果没有则报错#xff0c;依赖性太强动态加载#xff1a;运行时加载需要的类#xff0c;如果运行时不用该类#xff0c;即使…基本说明
反射机制是Java实现动态语言的关键也就是通过反射实现类动态加载。
静态加载编译时加载相关的类如果没有则报错依赖性太强动态加载运行时加载需要的类如果运行时不用该类即使不存在该类也不会报错降低了依赖性。
类加载时机
当创建对象时(new) //静态加载当子类被加载时父类也加载 //静态加库调用类中的静态成员时 //静态加载通过反射 //动态加载
类加载过程
加载阶段
JVM在该阶段的主要目的是将字节码从不同的数据源可能是 class文件、也可能是 jar包甚至网络转化为二进制字节流加载到内存中并将这些静态数据转换成方法区的运行时数据结构然后生成一个代表这个类的java.lang.Class对象。
链接阶段
验证(1)、目的是为了确保Class文件的字节流中包含的信息符合当前虚拟机的要求。并且不会会危害虚拟机自身的安全。(2)、包括文件格式验证(是否以魔数 oxcafebabe开头)、元数据验证、字节码验证和符号引用验证。(3)、可以考虑使用 -Xverify:none 参数来关闭大部分的类验证措施缩短虚拟机类加载的时间。准备JVM会在该阶段对静态变量分配内存并默认初始化对应数据类型的默认初始值如0、OL、null、false等)。这些变量所使用的内存都将在方法区中进行分配。解析虚拟机常量池内的符号引用常量名替换为直接引用地址)的过程。
初始化阶段
到初始化阶段,才真正开始执行类中定义的Java程序代码此阶段是执行clinit() 方法的过程。clinit() 方法是由编译器按语句在源文件中出现的顺序依次自动收集类中的所有静态变量的赋值动作和静态代码块中的语句并进行合并。虚拟机会保证一个类的clinit() 方法在多线程环境中被正确地加锁、同步如果多个线程同时去初始化一个类那么只会有一个线程去执行这个类的clinit() 方法其他线程都需要阻塞等待直到活动线程执行clinit() 方法完毕