类加载
加载:将class文件读入方法区内存,并为之创建一个Class对象。
验证:检查class文件的字节流中包含的信息是否符合当前虚拟机的要求。
准备:给类变量分配内存,给静态变量赋初始值,给静态常量赋定值。
解析:将常量池的符号引用换成直接引用。
初始化:给静态变量赋定值。
jvm三种类加载器:
启动类加载器 扩展类加载器 应用类加载器
类的加载:
把类的.class文件中读入到内存中,并创建一个对应的Class对象。然后连接(验证、准备、解析),最后JVM对类进行初始化。
包括:如果类存在直接的父类并且这个类还没有被初始化,那么就先初始化父类;如果类中存在初始化语句,就依次执行这些初始化语句。
类的加载是由类加载器完成的。
类什么时候被初始化?
1.创建类的实例(new 的方式)。访问类的静态变量,调用类的静态方法
2.使用反射的方法对类进行反射调用的时候。
3.当初始化一个类的时候,如果发现其父类还没有进行初始化,则需先触发其父类的初始化。
4.当虚拟机启动时,用户需指定一个要加载的主类(包含 main() 方法的那个类),虚拟机会先初始化这个主类。
5.当使用 JDK 1.7 的动态语言支持时,如果一个 java.lang.invoke.MethodHandle 实例最后的解析结果 REF_getStatic、REF_putStatic、REF_invokeStatic 的方法句柄,并且这个方法句柄所对应的类没有进行过初始化,则需先触发其初始化。
JVM的类加载机制是什么?
双亲委派机制,类加载器会先让自己的父类来加载,父类无法加载的话,才会自己来加载。
双亲委派机制可以打破吗?为什么
可以打破,比如JDBC使用线程上下文加载器打破了双亲委派机制。原因是JDBC只提供了接口,并没有提供实现。
反射
什么是反射机制?
在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;
这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
获得反射的方式?
类名.class,例如:Person.class;
创建对象.getClass(),例如:new Person().getClass();
Class.forName(),例如:Class.forName(“java.lang.String”);
Field类:提供有关类的属性信息,以及对它的动态访问权限。它是一个封装反射类的属性的类。
Constructor类:提供有关类的构造方法的信息,以及对它的动态访问权限。它是一个封装反射类的构造方法的类。
Method类:提供关于类的方法的信息,包括抽象方法。它是用来封装反射类方法的一个类。
Class类:表示正在运行的Java应用程序中的类的实例。
Object类:Object是所有Java类的父类。所有对象都默认实现了Object类的方法。
动态代理