Java类加载器
类加载器就是寻找类的字节码文件并构造出类在JVM内部表示的对象组件。在JAVA中,类装载器把一个类装入到JVM中,需要经过以下步骤:
装载:查找和导入class文件
-
连接:执行校验、准备和解析步骤,其中解析步骤是可以选择的:
- 校验:检查载入Class文件数据的正确性;
- 准备:给类的静态变量分配存储空间;
- 解析:将符号引用转成直接引用;
初始化:对类的静态变量,静态代码块执行初始化工作。
类装载工作由ClassLoader及其子类负责,ClassLoader是一个重要的Java运行时系统组件,它负责在运行时查找和装入Class字节码文件。JVM在运行时会产生三个ClassLoader;根装载器,ExtClassLoader和AppClassLoader。其中根装载器不是ClassLoader,是使用C++写的,在Java中看不到它,根装载器负责JRE核心类库的装载。 ExtClassLoader和AppClassLoader都是ClassLoader的子类。其中ExtClassLoader负责装载JRE扩展目录ext中的JAR类包;AppClassLoader负责装载ClassPath路径下的类包。
这三个类装载器存在父子层级关系,即根装载器是ExtClassLoader的父装载器。ExtClassLoader是AppClassLoader的父装载器。默认情况下使用AppClassLoader装载应用程序的类。
/**
* Created by Administrator on 2017/6/5.
*/
public class ClassLoaderTest {
public static void main(String[] args) {
ClassLoader loader = Thread.currentThread().getContextClassLoader();
System.out.println("current loader:"+loader);
System.out.println("parent loader:"+loader.getParent());
System.out.println("grantparent loader:"+loader.getParent().getParent());
}
}
运行结果
current loader:sun.misc.Launcher$AppClassLoader@e1641c0
parent loader:sun.misc.Launcher$ExtClassLoader@5736ab79
grantparent loader:null
JVM装载类时使用“全盘负责委托机制”,“全盘负责”是指当一个ClassLoader装载一个类时,除非显式的使用另一个ClassLoader,该类所依赖及引用的类也由这个ClassLoader载入;
“委托机制”是指先委托父装载器寻找目标类,只有在找不到的情况下才从自己的类路径中查找并装载目标类。这一点是从安全角度考虑的,可以有效的防止恶意的覆盖基础类的行为。
ClassLoader的重要方法:
根据全路径名装载类
public Class<?> loadClass(String name) throws ClassNotFoundException {
return loadClass(name, false);
}
从本地文件系统中载入Class文件
protected final Class<?> findSystemClass(String name)
throws ClassNotFoundException
{
ClassLoader system = getSystemClassLoader();
if (system == null) {
if (!checkName(name))
throw new ClassNotFoundException(name);
Class cls = findBootstrapClass(name);
if (cls == null) {
throw new ClassNotFoundException(name);
}
return cls;
}
return system.loadClass(name);
}
获得父类装载器
public final ClassLoader getParent() {
if (parent == null)
return null;
SecurityManager sm = System.getSecurityManager();
if (sm != null) {
checkClassLoaderPermission(parent, Reflection.getCallerClass());
}
return parent;
}
Java的反射机制
Class反射对象描述类语意结构,可以从Class对象中获取构造函数、成员变量、方法类等类元素的反射对象,并以编程的方式通过这些反射对象对目标类对象进行操作。这些反射对象类在java.reflect包中定义。
- Constructor :类的构造函数反射类。
- Method:类方法的反射类。
- Field,类的成员变量的反射类。