------- android培训、java培训、期待与您交流! ----------
步骤:
1.加载:由类加载器执行,该步骤查找字节码,并从这些字节码中创建一个Class对象2.链接:在链接阶段将验证类中的字节码,为静态域分配存储空间,并且如果必需的话,将解析这个类创建的对其他类的所有引用。
3.初始化:如果该类有超类,则对其初始化,执行静态初始化器和静态初始化块
类的加载:
类加载指的是将类的class文件读入内存,并为之创建一个java.lang.Class对象,而系统中所有的类,
它们实际上也是对象,称为类对象,它们都是java.lang.Class的实例,虚拟机为每种类型管理一个独一无
二的Class对象,也就是说,每个类(型)都有一个Class对象。
类的连接
连接阶段将会负责将类的二进制数据合并到JRE中验证
准备:类准备阶段则负责将类的静态属性分配内存,并设置默认初始值
解析
类的初始化
在类的初始化阶段,虚拟机负责对类进行初始化,主要就是对静态属性进行初始化,在Java类中对静态属性指定初始值有两种方式:(1)声明静态属性时指定初始值;(2)使用静态初始化块为静态属性制定初始值
当Java程序首次通过下面6种方式来使用某个类或接口时,系统就会初始化该类或接口。
a) 创建类的实例。
b) 调用某个类的静态方法。
c) 访问某个类或接口的静态属性,或为该静态属性赋值。
d) 使用反射方式来强制创建某个类或接口对应的java.lang.Class对象。
e) 初始化某个类的子类,当初始化某个类的子类时,该子类的所有父类都会被初始化。
f) 直接使用java.exe命令来运行某个主类时,程序会先初始化该主类。
类加载器
类加载器负责将.class文件加载到内存中,并为之生成对应的java.lang.Class对象。
在Java中,一个类用其全限定类名(包括包名和类名)作为标识。
在JVM中,一个类用其全限定类名和其类加载器作为其唯一标识。
当JVM启动时,会形成由三个类加载器组成的:
Bootstrap ClassLoader:根类加载器 它不是java.lang.ClassLoader的子类,而是由JVM自身实现rt.jar。
Extension ClassLoader:扩展类加载器 它负责加载JRE的扩展目录ext中JAR的类包。
System ClassLoader:系统类加载器 它负责在JVM启动时,加载来自命令java中的-classpath选项或java.class.path系统属性,
或CLASSPATH环境变量所指定的JAR包和类路径,默认是以当前路径作为系统加载路径。
AppClassLoader:用户自定义类加载器。
JVM类加载机制
全盘负责
父类委托:所谓父类委托是先让parent(父)类加载器试图加载该Class,只有在父类加载器无法加载该类时才尝试从自己的类路径中加载该类。
缓存机制
通过反射查看类信息
Java程序中获得Class对象通常有如下三种方法:
a) 使用Class类的forName()静态方法.该方法需要传入字符串参数,该字符串参数的值是某个类的全限定类名(必须添加完整包名)。
b) 调用某个类的class属性来获取该类对应的Class对象。
c) 调用某个对象的getClass()方法,该方法是java.lang.Object类中的一个方法,所以所有java对象都可以调用该方法,该方法将会返回该对象所属类对应的Class对象。
b方法:代码更安全,程序在编译阶段就可以检查需要访问的Class对象是否存在。
程序性能提高,因为这种方法无需调用方法,所以性能更好。
一旦获得某个类所对应的Class对象后,就可以调用Class对象的方法来获得该对象和该类的真实信息。
getDeclared 与访问级别无关,显式声明的。
get 获得所有的但只是public,包括继承的。