1、Class类的说明
实例、接口都是class,枚举是类,注解是接口,数组和基本数据类型也是类。基本数据类型(Int、float、byte、short等)的类和数据类(Integer、Float等)不是一个class。Class.java的私有构造函数只能JVM去调用,objects是JVM自动创建的,但是classes是类加载器加载的。
2、类运行时构造
JVM动态加载体现在,Class t = Class.forName("java.lang.Thread") 可以在运行时初始化类。
T t1 = Class.forName("T").newInstance()用来创建一个无参实例(调用无参构造函数)。
3、ClassLoader的说明
ClassLoader负责loading classes,具体过程是通过二进制类名,在文件系统中读取对应的class文件, 每一个object可以调用getClassLoader去得到对应的加载类 ClassLoader loader = t1.getClass().getClassLoader(); 数组对象是如果是基本数据类型,则没有classloader。Classloader使用委托模型(delegation modle)(递归寻找)去寻找classes和resources,即classloade使用其父loader去搜索,但是BootstrapClassLoader(built-in classloader)没有parent loader,是JVM直接调用。ClassLoader默认是并行调用,并行调用可能会在loading classes的期间导致死锁。用法:
ClassLoader loader = new NetworkClassLoader(host,port);
Object main = loader.loadClass("Main","true").newInstance();
4、加载类UML
Bootstrp loader
Bootstrp加载器是用C++语言写的,它是在Java虚拟机启动后初始化的,它主要负责加载%JAVA_HOME%/jre/lib,-Xbootclasspath参数指定的路径以及%JAVA_HOME%/jre/classes中的类。
ExtClassLoader
Bootstrp loader加载ExtClassLoader,并且将ExtClassLoader的父加载器设置为Bootstrp loader.ExtClassLoader是用Java写的,具体来说就是 sun.misc.Launcher$ExtClassLoader,ExtClassLoader主要加载%JAVA_HOME%/jre/lib/ext,此路径下的所有classes目录以及java.ext.dirs系统变量指定的路径中类库。
AppClassLoader
Bootstrp loader加载完ExtClassLoader后,就会加载AppClassLoader,并且将AppClassLoader的父加载器指定为 ExtClassLoader。AppClassLoader也是用Java写成的,它的实现类是 sun.misc.Launcher$AppClassLoader,另外我们知道ClassLoader中有个getSystemClassLoader方法,此方法返回的正是AppclassLoader.AppClassLoader主要负责加载classpath所指定的位置的类或者是jar文档,它也是Java程序默认的类加载器
URLClassLoader
只有当URLClassLoader被创建才会被调用,加载指定URL的类。
ClassLoader
抽象类,用户可以继承后自定义加载类。