JAVA - 深入JAVA 虚拟机 2
类的两种类型的类加载器
-Java虚拟机自带的加载器
根类加载器(Bootstrap): 使用C++编写,programer can not abtain this class.
扩展类加载器(Extension): 使用Java代码实现
系统类加载器(System):使用Java代码实现
-用户自定义的类加载器
java.lang.ClassLoader的子类: (public abstract class ClassLoader)
用户可以定制类的加载方式:
package practise; public class TestClassLoader { public static void main(String[] args) { Class clz=null; try { clz = Class.forName("java.lang.String"); System.out.println(clz.getClassLoader()); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } Class clz2=null; try { clz2 = Class.forName("practise.c"); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(clz2.getClassLoader()); } } class c{ }
null ---> 这个说明这个是根类加载器
sun.misc.Launcher$AppClassLoader@73d16e93 --->这个说明是应用加载器
sun.misc.Launcher$AppClassLoader@73d16e93 --->这个说明是应用加载器
JVM规范允许类加载器在预料某个类将要被使用时就预先加载它,如果在预先加载的过程中遇到了.class
文件缺失或者存在错误,类加载器必须在程序首次主动使用该类时才报告错误。
类被加载后,就进入连接阶段,连接就是将已经读入到内存的类的二进制数据合并到虚拟机的运行时环境中去
类的验证的内容:
-类文件的结果检查
-语义检查
-字节码验证
-二进制兼容性的验证
类的准备阶段

类的解析

类的初始化

类的初始化步骤:

package practise; import java.util.Random; class StaticBlock{ public static final int x = new Random().nextInt(100); static{ System.out.println("This is finaltest static block"); } } public class FinalTest { public static void main(String[] args) { System.out.println(StaticBlock.x); } }
Result:
This is finaltest static block
82
package practise; class StaticBlock2{ public static final int x = 6/3; static{ System.out.println("This is finaltest static block"); } } public class FinalTest2 { public static void main(String[] args) { System.out.println(StaticBlock2.x); } }
Result:
2
如果是常量,StaticBlock2不会被初始化,所以上面的static块不会被执行
posted on 2017-07-06 14:39 dawangandy 阅读(100) 评论(0) 收藏 举报
浙公网安备 33010602011771号